欢迎进入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]
成功是奋斗的结果,而奋斗是成功的必经之路。