java继承的一道题

来源:百度知道 编辑:UC知道 时间:2024/05/14 02:14:38
输出是:
Target=>0
Target=>30
Depend=>20
不知道怎么来的,哪位给我解释一下?

class Depend {
int i = 10;

public Depend() {
print();
i = 20;
}

void print() {
System.out.println("Depend=> " + this.i);
}
}

class Test1 extends Depend {
int i = 30;

public Test1() {
print();
super.print();
i = 40;
}

void print() {
System.out.println("Target=> " + i);
}

}

class Test{
public static void main(String[] args) {
new Test1();
}
}
这个代码不是我写的,我就是0这里有点不理解,现在差不多了,呵呵!

1、一共三个类,Depend,Test1——继承自Depend,Test。
2、运行顺序是,运行Test,实例化了Test1,又因为Test1继承自Depend,所以实例化Depend。先初始化Depend里的字段i,i为10,然后运行super的print方法。注意这里,因为Test1的方法重载,调用的是Test1的print方法,而它的i此时还未赋值,所以以默认值0显示,得Target=>0。然后把Depend里面的id值赋为20。
3、回到Test1里面,初始化字段i,为30;运行Test1的默认构造方法,运行Test1里面的print方法,得Target=>30。
4、再然后运行Depend里面的print方法,这里Test1里面的i对Depend的i不起作用,这时用的是Depend里面的i,得Target=>20。
5、最后把i变为40,但未使用。
注:如果改变Depend里面的print方法名,第一个0值会变为显示i为10,消除方法重载的影响。

看完后 我上机测试了一下你的问题
从测试的结果来看 我认为是这样的:
当 创建子类的实例 即 new Test1 时 由于它继承了depend类 所以先执行i=10
再执行 Depend的构造方法 其中执行到 print()方法时 由于 子类重写了该方法所以 实际执行的是子类的print方法 但是 此时子类的i=30 并没有被执行 所以i的值是0 第一个输出就是0了
执行完Depend的构造方法后 再轮到子类的 成员变量 i=30实例化
然后执行子类的构造方法 此时 i 的值已经被赋值为30 所以 输出为30
super方法 调用的是父类的print方法 所以 该方法 的输出应该就是父类的i的值 也就是 20
不知道 这么解释 你明白没有
不明白的话 可以PM我 我们再做讨论

看着你的代码老费劲了,看着你类的public 类名(){}的方法不敢肯定是该类的构造方法,就自己跑了下代码。结果就是你开头的,没错。
细想,只有public 类名(){}是构造方法才能解释的通了,我的是JDK1.6。习惯上构造方法是 类名(){},