打印本文 打印本文  关闭窗口 关闭窗口  
构造方法的初始化顺序
作者:佚名  文章来源:不详  点击数  更新时间: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();

  }

  }

打印本文 打印本文  关闭窗口 关闭窗口