Java子类与父类的初始化

本文探讨了Java中继承机制下变量与方法的隐藏与覆盖规则,解释了子类如何覆盖父类方法及隐藏父类变量的过程。通过具体示例展示了实例变量初始化与方法调用的顺序,以及如何通过引用访问不同作用域的变量。

java代码

class parent{

int x=10;

public parent(){

add(2);

}

void add(int y){

x+=y;

}

}

class child extends parent{

int x=9;

void add(int y){

x+=y;

}

public static void main(string[] args){

parent p=new child();

system.out.println(p.x);

}

}

class parent{

int x=10;

public parent(){

add(2);

}

void add(int y){

x+=y;

}

}

class child extends parent{

int x=9;

void add(int y){

x+=y;

}

public static void main(string[] args){

parent p=new child();

system.out.println(p.x);

}

}

问输出结果是什么?

答案应该是10。

要理解结果为什么是10,需要首先明白下面的知识:

(1)方法和变量在继承时的隐藏与覆盖

隐藏:若b隐藏了a的变量或方法,那么b不能访问a被隐藏的变量或方法,但将b转换成a后可以访问a被隐藏的变量或者方法。

覆盖:若b覆盖了a的变量或者方法,那么不仅b不能访问a被覆盖的变量或者方法,将b转换成a后同样不能访问a被覆盖的变量或者方法。

(2)java中变量与方法在继承中的隐藏与覆盖规则:

一、父类的实例变量和类变量能被子类的同名变量隐藏。

二、父类的静态方法被子类的同名静态方法隐藏,父类的实例方法被子类的同名实例方法覆盖。

三、不能用子类的静态方法隐藏父类的实例方法,也不能用子类的实例方法覆盖父类的静态方法,否则编译器会异常。

四、用final关键字修饰的最终方法不能被覆盖。

五、变量只能被隐藏不会被覆盖,子类的实例变量可以隐藏父类的类变量,子类的类变量也可以隐藏父类的实例变量。

在上面的试题中,子类child的实例方法add(int y)覆盖了父类parent的实例方法add(int y),而子类的实例变量x则是隐藏了父类的实例变量x。

child对象的初始化过程是:

首先为父类的实例变量x分配内存空间,因为在定义变量x时为它赋了值(int x=10),所以会同时将这个值赋给x。

其次调用父类的无参构造函数,parent的构造函数中做的唯一的事情就是调用了add(2);

第三、由于子类的add(int y)方法覆盖了父类的方法,所以add(2)实际调用的是子类的方法,在子类的add方法中做了如下操作x+=j;在这里由于子类的实例变量x隐藏了父类 的实例变量x,所以这条语句是针对子类本身的,但是这时还没有为子类的实力变量x分配空间,它的默认值是0,加2之后是2。

第四、父类初始化完毕后接着初始化子类,为子类的x分配内存空间并将它赋值为9,之前的add(2)操作白瞎了。

再次注意parent p=new child();这条语句,它是用父类的引用指向子类的对象,而前面已经说过变量只会被隐藏不会被覆盖,所以这时的p.x值应该是父类的10,而不是子类的9;

如果将输出语句换成下面的语句结果就是9了:

system.out..println(((child)p).x); //首先将p转换成child类型

原文:http://www.cnblogs.com/binjoo/articles/1585342.html


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
<think>好的,我现在需要回答用户关于Java子类继承父类初始化super快捷键的问题。首先,我得确认用户的问题核心是什么。用户可能是在使用IDE(比如Eclipse或IntelliJ IDEA)时,想知道如何快速生成子类构造函数中的super调用。 接下来,我应该回忆一下常见的IDE中生成构造函数的快捷键。例如,在IntelliJ IDEA中,当创建子类时,如果父类有带参数的构造函数,IDE通常会提示自动生成构造函数,这时候可以使用Alt + Insert(Windows/Linux)或Cmd + N(Mac)来打开生成菜单,然后选择构造函数,这时候会自动生成包含super(...)的代码。 另外,Eclipse中的操作可能类似,使用Alt + Shift + S打开源代码菜单,然后选择生成构造函数,或者使用Ctrl + Space进行代码补全,当输入super时可能会有提示。 需要注意的是,如果父类有默认构造函数(无参数),子类构造函数可能不会显式调用super(),但用户的问题可能更关注需要显式调用的情况,即父类没有默认构造函数,子类必须调用super(...)。这时候IDE的快捷键可以帮助快速生成。 还要考虑用户可能对IDE不熟悉,所以需要分步骤说明,比如在IntelliJ IDEA中的具体步骤:定位到子类,使用快捷键生成构造函数,选择父类参数,确认后自动生成super调用。 同时,需要提醒用户,如果父类构造函数有参数,子类必须显式调用super,否则会编译错误。此外,手动输入super时,IDE的自动补全功能也可能提供帮助,比如输入super(后按Ctrl + P查看参数提示。 最后,要确保回答结构清晰,分点说明不同IDE的操作,并指出注意事项,确保用户能够正确应用这些快捷键。</think>在Java子类继承父类时,关于构造函数中`super()`的初始化操作,不同IDE的快捷键和操作步骤如下: --- ### 一、IntelliJ IDEA 操作步骤 1. **生成子类构造函数** - 在子类中输入`new`关键字后,按`Alt + Insert`(Windows/Linux)或`Cmd + N`(Mac) - 选择 **Constructor** -> 勾选需要继承的父类参数 -> 确认后自动生成`super(...)`调用 2. **手动补全`super()`** - 输入`super(`后,按`Ctrl + P`查看父类构造函数参数提示 - 按`Tab`键自动填充参数(需提前定义变量) --- ### 二、Eclipse 操作步骤 1. **生成子类构造函数** - 在子类中按`Alt + Shift + S` -> 选择 **Generate Constructors from Superclass...** - 选择需要继承的父类构造函数 -> 确认后自动生成`super(...)` 2. **手动补全`super()`** - 输入`super(`后,按`Ctrl + Space`触发代码补全 -> 根据提示选择参数 --- ### 三、关键注意事项 1. **强制调用规则** - 如果父类**没有无参构造函数**,子类构造函数**必须显式调用`super(...)`**,否则编译报错 - 示例: ```java class Parent { public Parent(int x) {} // 父类没有默认无参构造 } class Child extends Parent { public Child() { super(10); // 必须显式调用 } } ``` 2. **默认行为** - 如果父类有无参构造,子类构造函数会**隐式调用`super()`**(无需手动编写) --- ### 四、手动编写优化建议 1. 输入`super`后,利用IDE的**参数提示功能**(如IntelliJ的`Ctrl + P`) 2. 通过`this.`访问子类字段时,确保父类参数已正确传递 --- 通过以上方法,可以高效处理子类继承时的`super()`初始化问题。不同IDE快捷键略有差异,但核心逻辑一致:**显式调用父类构造函数是子类初始化的必要步骤**。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值