JAVA-初步认识-第八章-继承-子父类中成员变量的内存图解

一.

ExtendsDemo2就不再画了,里面就两个函数,一个是主函数,一个是构造函数。其实我觉着还有show()函数。

主函数和局部变量进栈后,开始创建对象,这时候Zi类就开始加载了。但是有继承的关系,所以应该是父类先进来。原因是子类在用父类的东西,父类不先进来,子类就用不了。

父类加载进来之后,有一个父类的构造函数(这点说明什么,即使没有创建,构造函数也是一直都存在的),在方法区的父类空间里,num=4,或者说num进不进来呢?父类加载之后,就是子类加载进来。

类加载进来后,就开始创建对象了。我们都知道对象中肯定有一个num=5,但是num=4在哪?如果它在方法区里面的话,它是不开辟空间,那怎么运算?我们都知道方法区里面存的都是代码,运算区都应该在栈堆里面。父类是没有对象的,所以父类是没有必要存储num的(怎么理解),其实是存在子类里面的,怎么存的呢?子一继承,就意味着它里面多了一个属性。

子类对象中的两个属性表现如下,先有的fu的num属性,后有的zi的num属性。再进行分别的初始化。

紧接着,初始化完毕,我们就把地址赋值给this,指向完毕以后,我们都知道成员变量一定存放在堆里面,堆里面就这么一个对象,那么两个num只能在这一个地方分空间存储,有自己表示。

当我们进行c.show()的时候,show()方法进栈了,show()有this所属,this是当前对象,就把地址编号拿过来,它就指向了当前对象。

打印的时候,执行的时候,输出this的num,就找到this的对象,里面有两个num,找谁?this是本类的,就找zi的。接下来,打印super当中的时候,这个子类正因为和加载完成的父类有关系,它有一个super引用,代表的是这个父类,代表的是父类这片空间。

父类过程当中,成员变量随着子类对象的建立,已经存储在了对象当中了,接下来打印super.num的时候,走的是父类的num,fu的那片空间。对象中有子和父区分的,不区分,调用存在不确定性,它们有自己的存储。

这个图作为了解,这种情况在开发中几乎看不到。因为,描述的父类当中已经定义好了num,意味着它本身是共性内容,那子类建立的时候,为什么重新定义一个?又重新写属性,有点多余,父类有,直接拿来用就行。所以这种现象不多见,几乎没有。违反继承的思想。

通常情况下,它们都是私有的,它们对外提供方法访问,setnum(),getnum()。所以子类直接使用setnum(),getnum()就能完成父类当中num的访问了。没有必要完成num定义。

 问一个问题,父类中的私有内容子类是不是具备?

子类私不私有不用管,没什么用,(下面截图中所示)super.num是在访问父类中的num。一编译,出现了问题。

不私有没事,(父类中的num前面没有private修饰),子类当中不具备父类私有内容。子类对于父类中的num本身是继承过来的,就跟子类有自己的私有num是一个道理。就好像,子类中有一个num被私有了,它一样要在子类空间中存储,(存储在创建的对象中),我们在其他的类中,访问num,访问不了。因为num在存的时候,有private的修饰(在内存中是以一个数值的形式存在的),标志着是一个私有权限,外界不能访问,只能通过内部间接地方法来访问(private的目的是为了数据的安全性,不让外界接触)。

 由于父类中的num是私有的,那么子类虽然具有num,但也是私有的,外界无法访问。通过一些方法可以间接访问。

开发的时候,不多见,面试的时候常见。

 

转载于:https://www.cnblogs.com/wsw-bk/p/7735837.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值