多态性
- 对象的多态性:父类的引用指向子类的对象
e.g.
//Person是父类 Man Woman 为子类
Person p1 = new Man();
Person p2 = new Woman();
p2.eat();//调用的是子类Man的方法
p2.earnMoney();// Man中独有的方法!
//报错: The method earnMoney() is undefined for the type erson
- 多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法-–虚拟方法调用
所以能调用的都是子父类共有的方法
p1.eat()
中,编译时是看的方法是属于(Person)什么类的,实际运行时Man中的方法;
-
多态的使用:虚拟方法调用
有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
总结:编译,看左边;运行,看右边。 -
多态性使用前提:
- 存在类的继承关系(用的子类的方法)
- 存在方法的重写
-
对象的多态性,只适用于方法,不适用于属性(编译和运行都看左边的类)。
多态性是运行时行为,不是编译时行为
对于向上转型(子类转为父类): 多态
向下转型(父类转为子类) :强制转换 Man m1 = (Man)p1
后,可以调用子类Man
中特有的属性及方法
使用强转时,可能会出现ClassCastException的异常如:Woman w1 = (Woman)p1//此时p1已经是Man
该语句编译时可以通过,但是运行时会报上述的错误。