2020.3.24
今日偶遇继承中有关内存的问题,产生了一个疑惑,父类私有的成员变量真的没有被子类继承吗?
请看下面一个继承实例
//父类
package swu.cx.java;
public class Person {
private String name;
private int age;
public void setNameAge(String name,int age) {
this.name = name;
this.age = age;
System.out.println(this);//打印当前对象的地址
}
public void show(){
System.out.println("姓名:"+name+" "+"年龄:"+age);
System.out.println(this);
}
}
----------------------------------------------------------------------------------------
//子类
package swu.cx.java;
public class Student extends Person{
}
----------------------------------------------------------------------------------------
package swu.cx.java;
public class MyClass {
public static void main(String[] args) {
Student xw=new Student();
xw.setNameAge("xw",12);
xw.show();
System.out.println(xw);//打印xw的地址
}
}
//输出结果
// swu.cx.java.Student@42a57993
// 姓名:xw 年龄:12
// swu.cx.java.Student@42a57993
// swu.cx.java.Student@42a57993
当我看到可以为Student的一个实例xw赋值时,内心大大的问号,Student类明明啥都没有,为什么还可以使用this关键字赋值,神奇的是它居然还可以输出,我们知道this是调用当前对象的属性或者方法,从输出结果也可看出全程都在操纵xw这一个对象,xw空空如也,而按照常理父类Person的两个私有变量又无法继承,xw只是一个引用变量,他的实体啥都没有,为什么最终他有了姓名和年龄,到底怎么回事?
经过大量的搜索,得出下图,这和内存有关

实例化子类时内存图解.png
子类实例对象的堆内存被分成几个区域,如图所示,最大的那个框里的所有财产都归子类,所以父类的私有财产其实是被继承了的,只是对外不可见,相当于那份财产被冻结了,子类也无法拥有,因此通常被说为不可继承,便于理解而已,如此一来便可解释代码中出现的问题,通过父类提供的方法可以间接访问从它那里继承得来的私有成员变量,举个不恰当的例子,父亲过世后,儿子以父亲的名义(即方法)管理继承来的冻结财产(父类私有的成员变量)