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,但也是私有的,外界无法访问。通过一些方法可以间接访问。
开发的时候,不多见,面试的时候常见。