父类子类构造函数 java_Java基础-继承-子父类的构造函数-子类的实例化过程

继承中子父类成员变量的内存图解:

1,       划分栈,堆,方法区,空间。主函数进栈,变量z出现(如图1)。

7b2019a2bd2a0c8977ae5bb316dc2a7f.png

2,       由于子类继承父类,子类要使用父类,父类需先进方法区。先加载父类,再加载子类(如图2)。

1366eca6e9aae0c71f51c8e686b6d8d0.png

3,       接着开始执行newZi(),在堆里创建对象,划分空间地址(如图3)。

c53e1b0297c16cdaad04a8aa8ebfadea.png

4,       子类继承了父类,父类是存储在子类里面的。这个时候子类一继承父类,父类变量就到了子类里面(如图4)。

eaaf65443b12b767809430122da3eadc.png

5,       初始化完毕后,将0x0045赋给了z,z就指向了对象(如图5)。

210a1c79f2f6d18a0dd83d59355a7487.png

6,       接着执行z.show(),show方法进栈,show里面有this,this拥有所属对象的地址值0x0045。

84bec5849e8ff3920886c1f42470999b.png

继续执行show里的方法,this.num,super.num。子类加载完成了有一个父类的引用super。

7.show弹栈,main弹栈。

e9e6c3cb062285495904ffee33701b9b.png

7de5e6f5185b1501819304d3463f7c28.png

一个对象实例化过程:

Person p = new Person();

1,JVM会读取指定的路径下的Person.class文件,并加载进内存,并会先加载Person的父类(如果有直接的父类的情况下)。

2,在堆内存中的开辟空间,分配地址。

3,并在对象空间中,对对象中的属性进行默认初始化。

4,调用对应的构造函数进行初始化。

5,在构造函数中,第一行会先到调用父类中构造函数进行初始化。

6,父类初始化完毕后,在对子类的属性进行显示初始化。

7,在进行子类构造函数的特定初始化。

8,初始化完毕后,将地址值赋值给引用变量。

class Father {

int age = 50;

Father() {

super();

say();

return;

}

void say() {

System.out.println("爸爸");

}

}

class Son extends Father {

int age = 20;

Son() {

super();

//-->通过super初始化父类内容时,子类的成员变量并未显示初始化。等super()父类初始化完毕后,

//才进行子类的成员变量显示初始化。

say();

return;

}

void say() {

System.out.println("爸爸" + super.age + "岁");

System.out.println("儿子" + this.age + "岁");

}

}

class Test {

public static void main(String[] args) {

Son s = new Son();

// s.say();

}

}

执行结果:

爸爸50岁

儿子0岁

爸爸50岁

儿子20岁

重点:

通过super初始化父类内容时,子类的成员变量并未显示初始化。等super()父类初始化完毕后,才进行子类的成员变量显示初始化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值