规律:
1 先父类,后子类
2 先静态成员,后非静态成员,最后是默认构造函数
3 先执行父类的默认构造函数,再执行子类的非静态对象
顺序:
1 父类的静态成员
2 子类的静态成员
3 父类的非静态成员
4 父类的默认构造函数被调用
5 子类的非静态对象(变量)
6 子类构造函数
对象在内存的具体初始化过程
/*
一个对象的实例化过程:
A a = new A();
1 JVM 会读取指定路径下的 A.class 文件,并加载内存,并且,会先加载 A 的父类(如果有直接父类)
2 在堆内存中开辟空间,分配地址
3 在堆内存中,对 对象 的属性,进行默认初始化
4 调用对应的构造函数 进行初始化
5 在构造函数中,第一行会先到父类的构造函数中,进行父类初始化(如果有父类)
6 父类初始化完毕后,再对子类的属性,进行显式初始化
7 再进行 子类构造函数的 特定初始化
8 初始化完毕后,将地址赋值给 引用变量
*/
class Fu{
Fu(){
super();
show();
return;
}
void show(){
System.out.println("fu show");
}
}
class Zi extends Fu{
int num = 8;
Zi(){
super(); // 指向的是 父类的空间 引用 地址
/*
通过super初始化父类内容时,子类的成员变量并未显示初始化
等super()父类初始化完毕后,才进行子类的成员变量显示初始化
*/
System.out.println("zi cons run..."+ num);
return;
}
void show(){
System.out.println("zi show..."+ num);
}
}
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Zi z = new Zi(); // 这个结果是 zi.show 0 只是 new一个对象,是 0
z.show(); // 这个是 zi.show 8
}
}