回头看多态,又有了新的认识。
理解多态主要搞清楚以下几个问题就可以了:(以父类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,只是操作范围只有从