-
对象实例化:
Fu fu = new Fu();
Zi zi = new Zi();
1,JVM会去读取指定路径下的.class文件,并加载进内存,并会先加载父类(如果有直接父类的情况下)
2,在堆内存中开辟空间,分配地址。
3,并在对象空间中,对对象中的属性进行默认初始化
4,调用对应的构造函数,进行初始化
5,在构造函数中,第一行会先调用父类中的构造函数进行初始化。
6,父类初始化完毕后,再对子类的属性,进行显示初始化。
7,指定构造函数的特定初始化
8,初始化完毕后,将堆内存中的地址值赋给引用变量。 -
为什么子类实例化的时候要访问父类中的构造函数?
1)子类继承了父类,获取到了父类中的内容(属性),所以在使用父类内容之前要先看父类是如何对自己的内容进行初始化的。所以子类在构造对象时,就必须访问父类中的构造函数,因此要在子类的构造函数中加入super语句。
2)如果父类中没有定义空构造函数,那么子类的构造函数必须用super明确调用父类中对应的构造函数
3)子类构造函数中如果使用this调用了本类构造函数时,则调用this的这个构造函数中super便没有了,因为super和this都只能定义在第一行。但是可以保证的是,子类中肯定会有其它的构造函数访问父类的构造函数。
注:super语句必须要定义在子类构造函数的第一行。因为父类的初始化动作要先完成。 -
代码演示:
-
public class Demo {
public static void main(String[] args) {
//创建子类对象,通过子类构造方法对子类成员变量进行初始化
Zi z = new Zi();
//5.调用子类方法
z.show();
}
}
public class Fu {
public Fu() {
//2.子类通过super()调用父类构造方法
System.out.println("父类构造方法");
//3.执行show()方法
show(); // 子重写覆盖了父类同名show方法,调用的是子类show方法。
}
public void show() {
System.out.println("父类方法");
}
}
public class Zi extends Fu {
int num = 2;
public Zi() {
// 这里省略了super(),通过super()调用父类构造方法初始化父类,子类的成员变量并未显示初始化
// 4.等super()父类初始化完毕后,才进行子类的成员变量显示初始化。
System.out.println("子类构造方法。。。" + num);
}
//1.静态块无条件优先执行
static {
int num = 6;
System.out.println("静态块:num=" + num);
num = 8;
}
//重写了父类的show()方法
public void show() {
//3.执行子类的方法
//父类构造方法调用子类方法,此时num没有赋初值,默认值为0
System.out.println("子类方法:" + num);
}
}
对象实例化过程
最新推荐文章于 2024-05-02 02:25:22 发布