从JVM内存机制理解 java 的继承 重写 多态  构造 以及this关键字和super关键字

 

Java的对象是在堆空间中分配一块内存空间,对于继承来说,子类拥有父类所有权限范围内的属性和方法,但是实质上子类在分配空间时,其内存中已经分配了父类所有方法和属性的内存,包括了private在内。在内存上 子类的内存分配如下图

可以看作

 子类的内存空间=父类的内存空间 +子类自己独特的内存空间

 

从JVM内存机制理解 java 的继承 重写 多态  构造 以及this关键字和super关键字

然后来看一下this关键字和super关键字

this 关键字依靠对象而存在,它代表了对象,指向堆空间中对象的地址。

所以我们能用this来调用对象的成员方法和成员属性。也可以使用this来实现构造方法的互相调用。

之前一直以为super关键字是父类的对象。在子类中我们使用super来构造父类,我们使用super来调用父类的成员属性和成员方法。

但是我们使用getClass方法来获取super和this的类你就会发现

this.getClass()==super.getClass();

原来super和this都是子类的对象。那之前所认为的super调用父类的构造和super调用父类的属性和方法都是一种假象。

 

那super到底是什么呢,super是子类的对象,不过他管理的地方没有this的大,ta只负责子类对象内存中从父类继承而来的那一部分。

可以理解为 super是被强制类型转换为父类型的this

 

古时候,一个诸侯被分封在一个小国家当王,后来他大儿子继承了王位之后,吞并了周边几个国家,大儿子于是把父亲原来的封地分封给弟弟,让弟弟去管理父亲原来的封地。

this和super的关系就类似于此。

 

所以,在子类构造的时候会默认调用super来初始化父类,其实是初始化的是子类对象中来自父类的那部分属性和方法。说到底,子类始终自能构造自己的东西,父类的东西还是要super去构造。

楼下一家月饼店做的月饼很好买,后来他们又加了一个月饼包装流程,成了一家盒装月饼店,可说到底,月饼还得在厨房做出来不是吗。

 

我们在来看看子类重写父类的方法。子类重写父类的方法实质是什么?他是在父类方法的基础上添加自己的东西吗?其实不是,他是在内存中开辟了一块新的空间,重写的方法实质上相当于子类自己的新的东西。

如果是子类重写了父类的cry()方法,其实在子类对象的内存中,有父类cry方法的空间,

也有子类cry方法的空间,只是对于子类来说,父类cry()方法被隐藏了。子类现在只能使用自己的cry()方法了。

 

你老师之前交你学习写web前端,后来你想学java,然后就把web前端的技能送给了你同学,从此就不会写web前端了,然后有一天你想写一个网站,没办法,你只能找你同学来帮你写前端。

所以我们有了新的方法父类的方法就会隐藏起来

重写的过程是JVM在编译时执行,会覆盖掉父类的方法

 

从JVM内存机制理解 java 的继承 重写 多态  构造 以及this关键字和super关键字

 

从JVM内存机制理解 java 的继承 重写 多态  构造 以及this关键字和super关键字

 

从JVM内存机制理解 java 的继承 重写 多态  构造 以及this关键字和super关键字从JVM内存机制理解 java 的继承 重写 多态  构造 以及this关键字和super关键字

 

 

 

 

 

 

然后我们来看向上造型

从JVM内存机制理解 java 的继承 重写 多态  构造 以及this关键字和super关键字

上面程序输出的结果都是Sun类

 

故而在向上造型时,我们只能使用对象中继承于父类的部分

 

最后来说说我对java多态的理解,java中多态基于继承,重写,向上造型。

我们用多个子类型的共同父类的引用来指向子类型们的对象地址。基于向上造型来说,这些引用可以访问子类中来自父类的属性和方法。基于重写,这些引用去访问被重写的方法时,它们只能访问到子类重写的方法和属性。因为它们指向子类对象的内存,在子类对象内存里,来自父类的的方法已经被隐藏了,只能通过super关键字去访问。