------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
顺序:
(有子父类继承关系的情况下)
成员变量默认初始化--->父类构造器初始化--->成员变量显示初始化--->子类构造代码块初始化---->子类构造器初始化
源代码:
Fu(){
System.out.println("fu....run");
show();
}
void show(){
System.out.println("最上面的show()");
}
}
class Zi extends Fu{
int num=9;
//子类构造代码块
{
System.out.println("子代码快"+num);
//在子类代码块中为成员变量赋值为10
num=10;
}
//子类构造器
Zi(){
super();//隐式语句,指向父类
System.out.println("子类构造器中的"+num);
}
void show(){
System.out.println("最下下面的show()"+num);
}
}
class ChushiDemo{
public static void main(String[]args){
new Zi();
}
}
输出结果为:
---------- java -----
fu....run
最下下面的show()0
子代码快9
子类构造器中的10
---------- java -----
明确对象初始化的顺序与原理:
情况一:
[有继承关系情况下]
new对象,即刻成员变量默认(隐式)初始化
(num被系统赋予0),然后,父类构造器初始化,再然后调用show()
方法,此刻父类构造器完成;然后成员变量显示初始化(num被赋予9);
再然后,构造代码块初始化,再然后子类构造器完成初始化.
情况二:
[无继承关系情况下]
new对象,即刻成员变量默认(隐式)初始化
(num被系统赋予0),然后成员变量显示初始化(num被赋予9);再然后
构造代码初始化,再然后,构造器初始化.
以上两种情况区别就在于: super();语句.