声明:如果本文有错误,希望指出。
虽然学习和使用 Java 好多年了,但是对于多态的整体概念还是有点模糊。今天在看之前写的关于反射博文时,突然想到了 Java 的三大特性——多态。其他两个分别是**封装、继承**。只是想起多态的继承、重写,对于别的有点模糊了,于是就像自己整理下。
多态
多态指的是对象的多种形态。继承是多态的实现基础。当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的分类:
public class PolymorphicCase {
public static void main(String[] args) {
show(new Cat());
show(new Dog());
//向上转型
Animal animal = new Cat();
animal.eat();//调用的是Cat的 eat
//当使用多态方式调用方法时,首先检查父类中是否有该方法,
// 如果没有,则编译错误;如果有,再去调用子类的同名方法
animal.work();//编译报错
//向下转型
Cat cat = (Cat) animal;
cat.work();//调用的是Cat的work
}
public static void show(Animal animal) {
animal.eat();
if (animal instanceof Cat) {
Cat cat = (Cat) animal;
cat.work();
}
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.work();
}
}
}
abstract class Animal {
abstract void eat();
}
class Cat extends Animal {
@Override
void eat() {
System.out.println("猫吃鱼....");
}
public void work() {
System.out.println("猫抓老鼠....");
}
}
class Dog extends Animal {
@Override
void eat() {
System.out.println("狗吃骨头....");
}
public void work() {
System.out.println("look door....");
}
}
向上转型
Animal animal = new Cat();
对于这个对象的创建,就是体现了向上转型。
子类引用的对象转换为父类类型成为向上转型。通俗的说就是将子类对象转化为父类对象,此处对象可以是接口。
向下转型
Cat cat = (Cat) animal;
这里就是向下转型。与向上转型相对应的就是向下转型了。向下转型是把父类对象转为子类对象。
多态的实现
- 重写
- 接口
- 抽象类和抽象方法
总结
多态的优点
- 消除类型的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
多态存在的三个必要条件
- 继承
- 重写
- 父类引用子类对象