JAVA对象的初始化过程

出处:http://blog.csdn.net/andrew323/article/details/4665379函数

 

下面咱们经过两个例题来讲明对象的实例化过程。
例1:
   
编译并运行该程序会有如下输出
Static Block
Employee Company:china soft
Non-Static Block
Employee phone:0755-51595599
Employee(String)
Empoloyee()
下面咱们来对结果作分析:
1 在代码34行实例化对象时, 先对给静态变量分配内存空间并初始化,而后执行静态块。
所以,在这里会输出:
Static Block
Employee Company:china soft
Employee Company:china soft的输出也说明是先初始化静态变量而后再执行静态块,不然company将为null。
2而后在内存中为Employee分配内存空间,并作默认初始化(即全部变量初始化为默认值,这里都初始化为null)。
3 默认初始化完成后,开始显示初始化。即执行第5行,将phone初始化"0755-51595599",而且执行非静态方法块;所以在这里会有如下输出:
Non-Static Block
Employee phone:0755-51595599
4 最后才调用默认构造函数,在默认构造函数中调用了带参数的构造函数,因此在这里先输出带参数构造函数中的:Employee(String),而后才输出:Empoloyee()。
spa


例2:
 
 上面的代码中Manager继承了前面写的Employee类,当咱们编译并运行Manager类,会产生如下的输出:.net

Static Block
Employee Company:china soft
Sub Static Block
Manager department:sale
Non-Static Block
Employee phone:0755-51595599
Employee(String)
Empoloyee()
Sub Non-Static Block
Manager salary:8000
Manager(String)
Manager()
下面咱们对结果作分析:
1 在行34实例化对象时,因为Manager继承了Employee,因此先从父类Employee开始;先给父类静态变量分配内存空间并初始化,而后执行父类静态块。而后再给子类静态变量分配内存空间并初始化,而后执行子类静态块,因此会获得如下输出:
Static Block
Employee Company:china soft
Sub Static Block
Manager department:sale
对象

2而后在内存中为父类Employee分配内存空间,并作默认初始化;再为子类Manager分配内存空间,并作默认初始化。
3默认初始化完成后,从父类开始显示初始化并执行非静态方法块和构造函数,而后再子类开始显示初始化并执行非静态方法块和构造函数。所以会产生如下的输出:
Employee phone:0755-51595599
Employee(String)
Empoloyee()
Sub Non-Static Block
Manager salary:8000
Manager(String)
Manager()
blog

总结以上内容,能够获得对象初始化过程:
1 若是存在继承关系,就先父类后子类;
2 若是在类内有静态变量和静态块,就先静态后非静态,最后才是构造函数;
3 继承关系中,必需要父类初始化完成后,才初始化子类。继承

相关文章
相关标签/搜索