java中public class A2Demo {
public static void main(String[] args) {
new Koo();
}
}
class Foo {
int i=10;
int j=10;
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(j);
}
}这代码中,为什么会输出 0 10 呢,为什么i就是0,j就可输出值呢,
1 初始化子类对象时,先给子类的属性开辟空间(赋默认值,int型是0,即 i=0).
2 执行子类的构造函数(这里是默认的)之前,向上追溯其父类。在执行其父类构造函数之前,先给父类属性开辟空间并赋默认值,即父类的i=0,j=0.
3 再向上追溯其父类,此例即为 Object,执行Object构造函数。
4 再从Object返回来,在父类里,给属性显示赋值,i=10,j=10.
5 执行父类构造函数,test(), 但test()在子类重写了,所以执行的是子类的test()方法。输出的i是子类的i=0,j是继承父类的j,j=10. 输出结果就是这么来的。
6 父类构造函数执行完后,回到子类继续初始化,给属性i显示赋值3,即i=3.
7 执行子类的构造函数,(此例为默认的,不做任何事情)。初始化结束。供楼主参考。
可以看看:
http://wenwen.soso.com/z/q191435823.htm
java类的初始化顺序是:静态-> 父类成员变量 -> 父类构造函数 -> 子类成员变量 -> 子类构造函数。所以上面代码的执行顺序是: foo.i -> foo.j -> foo() -> koo.test() -> koo.i。test()是动态绑定的,因为方法也可以算静态的,所以已经可以绑定到koo.test()了。在koo.test()调用的时候调用的是koo.i,但是这时候koo.i还没有初始化,只有默认初始值0。