多态
A. 父类或者接口指向自己的子类对象
Fu f = new Zi(); NO ~~ Zi zi = new Fu();
B. 调用方法的时候,运行的是子类重写后的方法
C. 调用成员变量的时候,运行的是父类的成员变量
D. 在多态中,只能调用子类父类共有方法,不能调用子类的特有方法!!多态的弊端
E. 调用子类特有方法,必须进行类型的强制转换,将提升为父类类型的子类对象,转回子类的类型,手动!!
F. 保证程序的安全性,避免发生类型转换异常ClassCastException,采用instancof运算符,进行健壮性判断
/*
通过养宠物的案例,展示多态
*/
//每个动物的共性抽取
class Animal{
public void eat(){}
}
//养个鸟,吃的功能,飞翔
class Bird extends Animal{
public void eat(){System.out.println("鸟吃虫子");}
public void fly(){System.out.println("鸟在飞");}
}
//养狗,吃的功能,看家
class Dog extends Animal{
public void eat(){System.out.println("狗吃狗粮");}
public void lookHouse(){System.out.println("狗看家");}
}
//养猫,吃的功能,抓老鼠
class Cat extends Animal{
public void eat(){System.out.println("猫吃猫粮");}
public void catchMouse(){System.out.println("猫抓老鼠");}
}
class DuoTaiDemo3{
public static void main(String[] args){
Cat c = new Cat();
eat( c) ;
eat(new Bird()) ;
}
public static void eat(Animal a){//eat(new Cat()); Animal a = new Cat(); 向上转,多态
a.eat();
//进行类型转换的时候,判断一下,传递的对象是不是猫对象
//最后的一个比较运算符 instanceof 关键字,结果肯定真或者假
//判断一个引用,是不是由一个类创建的 :格式 引用类型变量 instanceof 类
// a instanceof Cat==>true a instanceof Dog==>false
if(a instanceof Cat){
Cat c = (Cat)a;
c.catchMouse();
}
if(a instanceof Dog){
Dog d = (Dog)a;
d.lookHouse();
}
if(a instanceof Bird){
Bird b = (Bird)a;
b.fly();
}
}