面向对象的特征之三:多态性
对象的多态性:父类的引用指向子类的对象
父类名 对象名=new 子类名();
多态的使用:当通过多态性创建的对象调用子类与父类同名同形参的方法时,实际执行的是子类重写父类的方法--------虚拟方法调用
多态性的使用前提:1、类的继承关系
2、方法的重写(经常在方法重写情况下用多态性)
对象的多态性只适用于方法不适用于属性(属性是谁的对象调用的就是谁的属性)
多态是运行时行为
public class duotai { public static void main(String[] args) { duotai c=new duotai(); c.fun(new dog()); c.fun(new cat()); } public void fun(Animal animal){ animal.eat(); animal.shout(); } } class Animal{ public void eat(){ System.out.println("动物叫"); } public void shout (){ System.out.println("动物吃东西"); } } class dog extends Animal{ public void eat(){ System.out.println("汪汪汪"); } public void shout(){ System.out.println("啃骨头"); } } class cat extends Animal{ public void eat(){ System.out.println("喵喵喵"); } public void shout(){ System.out.println("吃鱼"); } }
结果
汪汪汪
啃骨头
喵喵喵
吃鱼
多态性创建对象时是父类的引用指向子类
父类名 对象名=new 子类名();
编译看左边,实际看右边
由于是父类的对象进行调用,所以只能调用父类里面的方法和属性,如果子类的方法是重写方法则调用子类的方法。
如果是子类特有的方法,由于父类没有,从编译上看只能调用父类有的属性和方法,因此无法调用子类特有的方法和属性
如果要调用子类特有的属性和方法需要
对象名 instanceof 类名:判断这个对象是不是这个类的实例,如果是返回true,如果不是返回false
向下转型,使用强制类型转换符(子类转换为父类自由转换,而父类转化为子类需要强制转换)
使用强转时可能会出现ClassCastException的异常
为了避免ClassCastException的异常在向下转型之前,先进行instanceof的判断,如果返回的时true则进行向下转型。如果返回false,就不进行向下转型