多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。
多态指同一个实体同时具有多种形式。它是面向对象程序设计(OOP)的一个重要特征。如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的。JAVA中的多态性具体体现在运行和编译两个方面。运行时多态是动态多态,其具体引用的对象在运行时才能确定。编译时多态是静态多态,在编译时就可以确定对象使用的形式。
多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以基类的对象,来调用实现派生类中的方法。Java中通过继承并重写方法或实现接口来实现多态。
- 多态的体现
- 父类的引用指向了自己的子类对象
- 父类的引用也可以接收自己的对象
- 多态的前提
- 必须是类与类之间只有关系,要么继承或实现
- 通常还有一个前提,存在覆盖
- 多态的好处
- 多态的出现大大的提高了程序的扩展性
- 多态的弊端
- 只能使用父类的引用访问父类的成员
同样的,我们以上一边博客《JAVA面向对象之继承》中的例子来介绍多态。
因为仅仅是介绍多态的使用,我们精简一下Animal类
public class Animal {
public void say() {
System.out.println("动物发出叫声");
}
}
同样的精简Dog类
public class Dog extends Animal {
public void say() {
System.out.println("汪汪...");
}
}
我们再创建一个Cat类,同样继承自Animal
public class Cat extends Animal {
public void say() {
System.out.println("喵喵...");
}
}
我们可以创建一个测试类来验证一下Java的多态:
public class Test {
public void static main() {
Animal animal = new Animal();
Animal dog = new Dog();
Animal cat = new Cat();
animal.say();
dog.say();
cat.say();
}
}
运行后我们会看到控制台输出:
动物发出叫声
汪汪…
喵喵…
这就是Java多态的一种使用方式。