深入分析Java对象的建构顺序

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

  8、继续第一个Bar对象的创建、执行Bar的静态代码块,输出Bar static。

  9、从4-8步静态代码执行完成,继续执行Foo的初始化代码块输出Foo initialization,再执行Foo的构造函数本体输出Foo constructor。在Foo的构造函数中调用了printIndex函数,由于printIndex函数已经被子类Bar重写所以此时调用的是Bar中的printIndex函数,由于在构建第二个Bar对象时已经为静态字段bar赋值,所以静态变量bar此时有值,但实例变量index还是为缺省值0,输出Bar@4633c1aa和0,Foo构造函数完成,返回。

  10、执行Bar的初始化代码块输出:Bar initialization,再执行Bar的构造函数输出Bar constructor,Bar@4633c1aa和100,Bar构造函数完成。

  11、Object reference bar指向heap之中最后创建完成的Bar对象,此时第一个Bar的对象创建完成。

  12、66行调用bar对象函数输出Bar@4633c1aa和100.

  13、67行此时给bar引用从新赋值,又从步骤一重复全部过程,由于静态只实例化一次所以输出为:Foo initialization、Foo constructor、Bar@4633c1aa、0、Bar initialization、Bar constructor、Bar@4633c1aa、100

  输出结果为:

  //代码在65行建构第一个Bar对象

  Foo static

  //代码执行到41行建构第二个Bar对象

  Foo initialization

  Foo constructor

  null

  0

  Bar initialization

  Bar constructor

  null

  100

  //代码执行到56行第二个Bar对象建构完,继续建构第一个Bar对象

  Bar static

  Foo initialization

  Foo constructor

  Bar@4633c1aa

  0

  Bar initialization

  Bar constructor

  Bar@4633c1aa

  100

  //66行调用第一个Bar对象的函数输出结果

  Bar@4633c1aa

  100

  //67行此时第一个Bar对象执行完,给第一个Bar引用从新建构对象

  Foo initialization

  Foo constructor

  Bar@4633c1aa

  0

  Bar initialization

  Bar constructor

  Bar@4633c1aa

  100

[1][2]

成功是奋斗的结果,而奋斗是成功的必经之路。

深入分析Java对象的建构顺序

相关文章:

你感兴趣的文章:

标签云: