回头看多态,又有了新的认识。
理解多态主要搞清楚以下几个问题就可以了:(以父类Pet,子类Dog为例)
1.为什么可以用表达式 Pet p1= new Dog(); //为什么可以用父类的引用指向子类创建的对象?
2. 当用父类的引用p1,操作子类的对象的时候,为什么可以操作复写(override)的Method,怎么知道该Method是子类的而不是父类的?
3. 当用父类的引用p1操作子类的时候,有哪些限制?
下面进行解答:
理解多态的前提是理解继承(面向对象的三个基本特征:封装、继承、多态)
继承在此不做多的解释,只需要知道两点:1.父类中private 方法或者属性是不能够被继承到子类中;2. 子类实际又两部分组成,一部分是从父类那里copy过来的,还有一部分是自己的。从内存的角度来说,子类在初始化的时候,先初始化继承的那部分,也就是父类的东西(这里的初始化本质可以理解为复制,后面会通过实例进行详细解读),再初始化自己特有的部分。
例如下图,父类Pet中有属性a、还有三种不同类型的sayX方法。子类Dog继承了父类的属性a、public say()以及Protected say1(),还有自己的方法cute。
下面说一下多态机制的原理
- 执行Pet p1=new Dog(); p1虽然是Pet类型的引用,但实际仍然指向Dog,只是操作范围只有从父类继承来的哪些属性或者方法。比如,本例中,p1实际操作范围,只有a,say,say1。不能操作say2,因为say2并没有继承到Dog类中。另外,子类在初始化的时候,也会将父类的方法申明所使用的偏移量赋值一份。
- JVM在执行class文件的时候,也就是在内存中执行Java的程序的时候,会将父类的Method,放到Method Table 里面,子类复写了父类中的方法后,初始化子类的时候,就会将Method Table中相应

本文深入探讨了Java中的多态机制,从内存角度解析了为何父类引用可以指向子类对象。通过分析继承、方法表和动态绑定,揭示了多态实现的本质。在内存中,父类的Method被放入Method Table,子类覆盖方法时会更新表项,确保调用的准确性。文章通过实例展示了多态的应用,并提及接口实现多继承的差异。
最低0.47元/天 解锁文章
181

被折叠的 条评论
为什么被折叠?



