多态的含义
多态的前提是要有继承/实现的关系
在代码表现中,父类指向的是子类的对象。
class Fu{}
class Zi extends Fu{}
Fu fu = new Fu();
Zi zi = new Zi();
//多态:父类变量指向的是子类的对象
Fu fu = new Zi();
//错误
Zi zi = new Fu();
//大类型的变量指向小类型的数据,只能从大到小,不能从小到大
可以通过父类去声明创建子类对象(大—>小),不能通过子类对象去创建父类对象。
多态就是将子类的身份提高到了父类的身份,但是并不会改变子类对象本质
多态调用
成员变量:在多态情况下,只能用父类的成员变量。
成员函数:如果子类重写 则用子类;
子类未重写,则只能用父类的成员函数;
若父类无,则子类的特有函数一概不能用。
多态的对象类型转换
子类向下转换的时候,只能转为子类对象原本的类型,不可转为其他类型。但可以看作父类对象来用。
abstract class PolyAnimal {
public abstract void eat();
}
class PolyDog extends PolyAnimal {
public void eat() {
System.out.println("狗吃肉");
}
public void watchDoor() {
System.out.println("狗看门");
}
}
class PolyCat extends PolyAnimal{
public void eat() {
System.out.println("猫吃鱼");
}
public void catchMouse() {
System.out.println("猫捉老鼠");
}
}
//PolyAnimal animal = dog;指向狗的对象
//PolyCat cat01 = (PolyCat) animal;但想把狗对象转化为猫对象;不行.
//PolyAnimal dog0 = (PolyCat) animal;这个可以。
如何判读父类引用的子类对象类型?
instanceof关键字—用于判断对象类型
if(poAnimal instanceof Polydog){
PolyDog dog = (PolyDog) PolyAnimal;
dog.watchDoor();
}