设为首页 加入收藏

TOP

构造方法的初始化顺序
2014-11-23 17:51:41 】 浏览:5639
Tags:构造 方法 初始 顺序

  想像一下你正在用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();


  }


  }


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Java基础学习:functor的实现 下一篇再谈客户端的Java技术

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目