构造器的小问题,在线等
java文件中,
public class A2Demo {
public static void main(String[] args) {
Koo koo = new Koo();
}
}
class Foo {
public Foo(){
this.test();
}
public void test(){
System.out.println("foo");
}
}
class Koo extends Foo{
int i = 3;
public void test(){
System.out.println(i);
}
}
问: 子类中的 System.out.println(i); 为什么会输出0呢,为什么不输出3呢,thanks
------解决方案--------------------因为父类构造方法先执行,这时候子类的东西还没初始化呢,当然还是默认值
------解决方案--------------------有点意思,帮顶一下……
------解决方案--------------------从父类“回来”后,给i赋值3,再执行子类的构造函数。
------解决方案--------------------嗯,我Debug跟踪了一下,正如1楼所言。楼主也可以跟踪看看,就明白了。
------解决方案--------------------产生隐蔽的错误。
------解决方案--------------------构造子类前先构造父类
父类先构造没有赋值就是0了
------解决方案--------------------构造器中如果非要调用方法,建议调用static 或final的方法,要不然容易产生隐蔽的bug
------解决方案--------------------在子类的默认构造器中有个默认调用的方法 super()
就是调用了父类的构造器,此时i还没有初始化,是0。
父类的构造器调用了test()方法
此时的test方法是子类的test()方法而不是父类的,
因为子类的test已经覆盖了父类的方法,所以输出了0。