多态
概述
多态是继封装、继承之后,面向对象的第三大特性。
生活中,比如跑的动作,小猫、小狗和大象,跑起来是不一样的。再比如飞的动作,昆虫、鸟类和飞机,飞起来也是不一样的。可见,同一行为,通过不同的事物,可以体现出来的不同的形态。多态,描述的就是这样的状态。
定义
指同一行为,具有多个不同表现形式。
前提
- 继承或者实现【二选一】
- 方法的重写【意义体现:不重写,无意义】
- 父类引用指向子类对象【格式体现】
代码实现
代码当中体现多态性,其实就是一句话:父类引用指向子类对象。
格式:
父类名称 对象名 = new 子类名称();
或者
接口名称 对象名 = new 实现类名称();
成员变量、方法访问规则
成员变量
1.直接通过子类对象访问成员变量:
等号左边是谁,就优先用谁,没有则向上找。
2.间接通过成员方法访问成员变量:
该方法属于谁,就优先用谁,没有则向上找。
与继承相同。
成员方法
右边new的是谁,就优先用谁,没有则向上找。
与继承相同。
口诀
成员变量:编译看左边,运行还看左边。
成员方法:编译看左边,运行看右边。
多态的好处
向下转型和向上转型
instanceof 关键字
为了避免ClassCastException的发生,Java提供了 instanceof 关键字,给引用变量做类型的校验,格式如下:
1.变量名 instanceof 数据类型
2.如果变量属于该数据类型,返回true。
3.如果变量不属于该数据类型,返回false。
public class Test {
public static void main(String[] args) {
Animal animal = new Dog();
animal.eat();
givePet(animal);
givePet(new Cat());
}
public static void givePet(Animal animal){
if(animal instanceof Dog){
Dog d = (Dog) animal;
d.protectHouse();
}
if(animal instanceof Cat){
Cat c = (Cat) animal;
c.catchMouse();
}
}
}