想像一下你正在用java写程序,并且用下面的代码初始化类 A 和 B 的对象:
class A {
int a = f();
int f() {
return 1;
}
}
class B extends A {
int b = a;
int f() {
return 2;
}
}
public class CtorDemo1 {
public static void main(String args[]) {
B bobj = new B();
System.out.println(bobj.b);
}
}
现在,好像很明显的当初始化完成后,bobj.b的值将是1。毕竟,类B中的b 的值是用类A中的a的值初始化的,而a 是用f 的值初始化的,而它的值为1,对吗?
实际上, bobj.b 的值是2,要知道为什么需要知道对象初始化的问题。
当一个对象被创建时,初始化是以下面的顺序完成的:
1. 设置成员的值为缺省的初始值 (0, false, null)
2. 调用对象的构造方法 (但是还没有执行构造方法体)
3. 调用父类的构造方法
4. 使用初始化程序和初始块初始化成员
5. 执行构造方法体
看看在实际中是如何一步一步完成的,看看下面的例子:
class A {
A() {
System.out.println("A.A called");
}
}
class B extends A {
int i = f();
int j;
{
j = 37;
System.out.println("initialization block executed");
}
B() {
System.out.println("B.B called");
}
int f() {
System.out.println("B.f called");
return 47;
}
}
public class CtorDemo2 {
public static void main(String args[]) {
B bobj = new B();
}
}