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

解决方案 »

  1.   

    嗯,我Debug跟踪了一下,正如1楼所言。楼主也可以跟踪看看,就明白了。
      

  2.   

    1楼正解。
    所以在编程中尽量不要在构造函数中调用可以被override的函数(非私有函数),因为子类在override的时候可能会如本例中一样使用还未被初始化的字段,从而产生隐蔽。 
      

  3.   

    构造器中如果非要调用方法,建议调用static 或final的方法,要不然容易产生隐蔽的bug
      

  4.   

    在子类的默认构造器中有个默认调用的方法 super()
    就是调用了父类的构造器,此时i还没有初始化,是0。
    父类的构造器调用了test()方法
    此时的test方法是子类的test()方法而不是父类的,
    因为子类的test已经覆盖了父类的方法,所以输出了0。