一、多态的定义
多态:是指同一行为,具有多个不同表现的形式。多态就是同一个接口,使用不同的实例而执行不同操作。
同一个事件发生在不同的对象上会产生不同的结果。如图所示:
二、使用多态的前提(三个必要条件)
1.继承或者实现(二选一)
2.方法的重写(意义体现:不重写,无意义)
3.父类引用指向子类对象(格式体现) Parent p = new Child();
public class Shape {
public void draw() {}
}
public class Circle extends Shape {
public void draw() {
System.out.println("Circle");
}
}
public class Square extends Shape {
public void draw() {
System.out.println("Square");
}
}
public class Triangle extends Shape {
public void draw() {
System.out.println("Triangle");
}
}
三、 多态的体现
多态体现的格式:
父类数据类型 变量名 =new 子类对象;
变量名.方法名();
父类类型:值子类对象继承的父类类型,或者实现的父类接口类型。
代码如下:
Fu f = new Child();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
public class Test {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 对象调用 show 方法
show(new Dog()); // 以 Dog 对象调用 show 方法
Animal a = new Cat(); // 向上转型
a.eat(); // 调用的是 Cat 的 eat
Cat c = (Cat)a; // 向下转型
c.work(); // 调用的是 Cat 的 work
}
public static void show(Animal a) {
a.eat();
// 类型判断
if (a instanceof Cat) { // 猫做的事情
Cat c = (Cat)a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
}
public abstract class Animal {
public abstract void eat();
}
public class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
public void work() {
System.out.println("抓老鼠");
}
}
public class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}
四、多态的好处
在开发中可以把父类(接口类型) 类型定义为方法的形参,在实际调用的时候传入的实际参数比较灵活,可以传入父类类型的对象,也可以传入任意一个子类类型的对象
- 1. 消除类型之间的耦合关系
- 2. 可替换性
- 3. 可扩充性
- 4. 接口性
- 5. 灵活性
- 6. 简化性