下面我重新发一次程序:
父类:public class Test001 {
int i =10;
public Test001(){
print();
i =20;
}
void print(){
System.out.println("子类=>"+i);
}
}
子类public class Qdb extends Test001{
int i =30;
public Qdb(){
print();
super.print();
i =40;
}
void print(){
System.out.println("父类=>"+i);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Qdb();
}
}
运行结果是:
父类=>0
父类=>30
父类=>20
------解决方案--------------------
java类加载顺序:先父类的static成员变量-》子类的static成员变量-》父类的成员变量-》父类构造-》子类成员变量-》子类构造。
但是lz你要注意,Java中一些类皆由Object出。
所以,是先追溯根至调用Object的构造方法,所以此时无论父类Test001还是子类Qdb的i值皆为0(因为i为整形),紧接着初始化父类的值i,结果父类的i=10,然后进入父类的构造方法,调用print(),由于多态性,实际调用的是Qdb的print(),因为Qdb本身域里i值为0,所以输出“父类=>0”,然后将父类域的i赋值为20,然后回到子类域。这时执行的操作是给子类域的i赋值为30,然后执行print(),这里显示是子类的print,所以打印“父类=>30”。然后就是你显式的调用父类的print,则执行父类的print方法,输出“子类=>20”,最后赋子类域的i为40.
如果你把打印输出语句的父子类语句改正确(你的Test001是父类,Qdb是子类),应该是:
子类=>0
子类=>30
父类=>20
------解决方案--------------------
lz ,2楼说的很好!
你可以多设几个断点调试一下,你就会跟踪发现,初始化加载的时候你定义的变量值都为0,
还要注意的一点就是2楼说的,由于多态性,你执行父类的print()实际上是执行了子类的print()。
这一点你可以在调试的时候很明星的看到,方便的话你可以给父类里的print()改个名字试试,更能明显看出多态性意义。