日期:2014-05-20  浏览次数:20659 次

子父类继承的问题--求解释为什么运行的结果是03040
package test;
public class Sub extends Super {
int j = 30;
Sub() {
print();
j = 40;
}
void print() {
System.out.print(j);
}
public static void main(String[] args) {
System.out.print(new Sub().j);
}
}
class Super {
int i = 10;
Super() {
print();
i = 20;
}
void print() {
System.out.print(i);
}
}

------解决方案--------------------
1楼解释有错误:

1 程序执行new Sub()时,先给变量j赋默认初值0.(而不是 j=30;)。
2 父类的print方法被子类覆写了,跳到父类的构造方法时,执行的是子类被覆写的print()方法。
3 第一个输出是把j(=0)输出了。
4 父类构造方法执行完后,回到子类,这时先给变量j显示赋值(j=30).
5 子类构造方法执行,输出30。
6 最后40好理解。

楼主可以把父类构造方法直接输出一个字符串,比如 System.out.println("Hello"); 可以看到根本不执行。


------解决方案--------------------
探讨
引用:

1楼解释有错误:

1 程序执行new Sub()时,先给变量j赋默认初值0.(而不是 j=30;)。
2 父类的print方法被子类覆写了,跳到父类的构造方法时,执行的是子类被覆写的print()方法。
3 第一个输出是把j(=0)输出了。
4 父类构造方法执行完后,回到子类,这时先给变量j显示赋值(j=30).
5 子类构造方法执行,输出30。
6 ……