日期:2014-05-20  浏览次数:20843 次

构造器的小问题,在线等

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。