想像一下你正在用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). } }
int f() { System.out.println("B.f called"). return 47. } }
public class CtorDemo2 { public static void main(String args[]) { B bobj = new B(). } }
程序的输出是:
A.A called B.f called initialization block executed B.B called
B 的构造方法被调用,但是最先做的事情是隐含的调用父类的构造方法。父类必须自己负责初始化它自己的状态而不是让子类来做。 然后B对象的成员被初始化,这包含一个对B.f 的调用和包围在{}中的初始块的执行。最后B的构造方法体被执行。 你可能会问“什么是对父类的构造方法的隐含调用”。这意味着如果你的构造方法的第一行不是下面内容之一: