Java的对象是在堆空间中分配一块内存空间,对于继承来说,子类拥有父类所有权限范围内的属性和方法,但是实质上子类在分配空间时,其内存中已经分配了父类所有方法和属性的内存,包括了private在内。在内存上 子类的内存分配如下图
可以看作
子类的内存空间=父类的内存空间 +子类自己独特的内存空间
然后来看一下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在编译时执行,会覆盖掉父类的方法
然后我们来看向上造型
上面程序输出的结果都是Sun类
故而在向上造型时,我们只能使用对象中继承于父类的部分
最后来说说我对java多态的理解,java中多态基于继承,重写,向上造型。
我们用多个子类型的共同父类的引用来指向子类型们的对象地址。基于向上造型来说,这些引用可以访问子类中来自父类的属性和方法。基于重写,这些引用去访问被重写的方法时,它们只能访问到子类重写的方法和属性。因为它们指向子类对象的内存,在子类对象内存里,来自父类的的方法已经被隐藏了,只能通过super关键字去访问。