简单理解
简单理解就是,同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
说人话就是,对于一个父类,有个类继承它对吧,我可以重写父类的方法对吧,我可这样重写对吧,又有一个类,也能继承它对吧,也能重写父类的方法对吧,那样重写对吧,这俩类都继承了一个父类,都重写了父类的方法,但是重写的内容不同,这叫多态;同理,有个父接口,两个类对父接口的实现不同,不也是多态。
满足多态的三个条件
如果按照这个概念来定义的话,那么多态应该是一种运行期的状态。为了实现运行期的多态,或者说是动态绑定,需要满足三个条件:
1.有类继承或者接口实现
2.子类要重写父类的方法
3.父类的引用指向子类的对象。
代码示例
// 父类 Animal class Animal { public void makeSound() { System.out.println("动物发出声音"); } } // 子类 Dog 继承自 Animal class Dog extends Animal { @Override public void makeSound() { System.out.println("狗发出汪汪的声音"); } } // 子类 Cat 继承自 Animal class Cat extends Animal { @Override public void makeSound() { System.out.println("猫发出喵喵的声音"); } } public class PolymorphismExample { public static void main(String[] args) { Animal animal1 = new Dog(); // 使用父类引用指向子类对象 Animal animal2 = new Cat(); // 使用父类引用指向另一个子类对象 animal1.makeSound(); // 调用的是子类 Dog 的 makeSound() 方法 animal2.makeSound(); // 调用的是子类 Cat 的 makeSound() 方法 //父类引用指向不同的子类对象,展现出多种不同的姿态。 } }
在代码中同样是动物的发出叫声的操作,在狗子身上就是 “汪汪汪”,在猫身上就是 “喵喵喵”(同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果)
多态分类
前面说多态是一种运行期的概念。还有一种说法,包括维基百科也说明,认为多态还分为动态多态和静态多态。
动态多态
是指在运行时确定对象的具体类型,并根据对象的类型调用相应的方法。Java中的方法重写就是一种动态多态,因为在运行时,虚拟机会根据对象的实际类型来调用相应的方法。
静态多态
是指在编译时确定函数或方法的具体调用,这种多态性也被称为重载(overloading)。Java中的方法重载就是一种静态多态,因为在编译时就能够确定调用的方法。
个人观点
我认为,多态应该是一种运行期特性,Java中的重写是多态的体现。不过也有人提出重载是一种静态多态的想法,这个问题在StackOverflow等网站上有很多人讨论,但是并没有什么定论。我更加倾向于重载不是多态。