多态就是同一个行为具有多种不同表现形式的能力,通俗点讲,多态就是一个接口使用不同的实例而执行不同的操作。
作为面向对象的三大特性之一,多态在我们的开发过程中起到了很重要的作用。要使用多态必须满足三个前提条件:
- 继承
- 重写
- 父类引用指向子类对象(Parent p = new Child();)
当使用多态方式调用方法时,首先检查父类中是否有该方法,若没有则编译错误;找到该方法后再去调用子类的同名方法。这种实现方式能让程序有良好的扩展性,并可以对所有类的对象进行通用处理。
多态有三种常用的实现方式:
(1)重写:也就是子类重写父类的方法。
(2)接口:子类通过实现接口来实现多态
(3)抽象类和抽象方法:与接口同理,都是通过继承实现多态
多态的优点
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
讲多态当然离不开代码,来,上码!
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();
}
}
}
abstract class Animal {
abstract void eat();
}
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}
理解多态的关键是理解方法调用,很多初学者会迷惑,我到底该调用哪个对象,很简单,看后边的对象就可以了。后边的对象是什么类型,就调用那个对象的方法。