刚学java的多态 求解下面的程序
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);
}
/**
* @param args
*/
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