![]() ![]() |
|
构造方法的初始化顺序 | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/3/20 18:36:09 文章录入:杜斌 责任编辑:杜斌 | |
|
|
想像一下你正在用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(); } } |
|
![]() ![]() |