public class Test extends Test1{
int i=30;
Test(){
print();
i=40;
}
public static void main(String[] args) {
System.out.println(new Test().i);//40
}
void print(){
System.out.println(i);// 0 30
}
}
class Test1 {
int i=10;
Test1(){
print();
i=20;
}
void print1(){
System.out.println(i);
}
}
int i=30;
Test(){
print();
i=40;
}
public static void main(String[] args) {
System.out.println(new Test().i);//40
}
void print(){
System.out.println(i);// 0 30
}
}
class Test1 {
int i=10;
Test1(){
print();
i=20;
}
void print1(){
System.out.println(i);
}
}
第一不先运行那个Test1()的构造函数
里面有那个print()被子类test重写了,就是被覆盖了,(这样覆盖还是第一次见^_^,没实际意义)
她那个i值不能调回那个i=10,结果就默认了个i=0;掉回
第一运行Test()出来个30
.i就出来个40
再你的例子中实例化类Test,先调用父类Test1的构造函数而你里面有print()方法,他会调用Test类里面的print()方法而不调用Test1的print(),而i还没有实例,所以i=0;
之后调用Test的构造函数,里面有print()方法,打印出i=30;然后给i赋值i=40;
最后是打印".i"的值 i=40。
好,讲的透彻!
创建本类对象,执行构造函数的时候首先去调用父类的构造函数。但不巧的是你的程序里覆盖了父类的print,所以就调用你的print了。
你可以把程序小做修改,就看出来效果了。比如,去掉子类的print定义,看看,他就输出了父类的i值。public class Test extends Test1{
int i=30;
Test(){
print();
i=40;
}
public static void main(String[] args) {
System.out.println(new Test().i);
}
//void print(){
//System.out.println("t");
//}
}
class Test1 {
int i=10;
Test1(){
print();
i=20;
}
void print(){
System.out.println(i);
}
}
//还可以多做小的修改,不断查看分析结果,就更明白了。