首先来看什么是多态
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作。

多态性是对象多种表现形式的体现。
多态的优点
- 消除类型之间的耦合关系;
- 可替换性;
- 可扩充性;
- 接口性;
- 灵活性;
- 简化性;
多态存在的三个必要条件
- 继承;
- 重写;
- 父类引用指向子类对象:Parent p = new Child();

package com.zxy.demo.Test;
public class DuoTai {
public static void main(String[] args) {
Shape s1 = new Circle();
Shape s2 = new Square();
Shape s3 = new Triangle();
s1.draw();
s2.draw();
s3.draw();
}
}
class Shape{
void draw(){}
}
class Circle extends Shape{
@Override
void draw() {
System.out.println("Circle.draw()");
}
}
class Square extends Shape {
@Override
void draw() {
System.out.println("Square.draw()");
}
}
class Triangle extends Shape {
@Override
void draw() {
System.out.println("Triangle.draw()");
}
}
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
package com.zxy.demo.Test;
public class DuoTai1 {
public static void main(String[] args) {
show(new Cat());
show(new Dog());
Animal a = new Cat();
a.eat();
Cat c = (Cat) a;
c.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 public void eat();
}
class Cat extends Animal {
@Override
public void eat() {
System.out.println("吃鱼");
}
public void work(){
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
@Override
public void eat() {
System.out.println("吃骨头");
}
public void work(){
System.out.println("看家");
}
}
多态的实现方式
重写;
接口:
- 生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型。
- java中的接口类似于生活中的接口,就是一些方法特征的集合,但没有方法的实现。
抽象类和抽象方法。
为什么要使用多态
- 可替换性: 多态对已存在代码具有可替换性。例如,多态对水果类工作,对苹果,橙子也同样工作。
- 可扩充性: 多态对代码具有可扩充性,可扩充功能。新加子类更容易获得多态功能。例如,在实现苹果的多态基础上,很容易增添水果类的多态性。
- 接口性: 多态是超类通过方法签名,向子类提供了一个共同接口 ,由子类来完善或者覆盖它而实现的。
- 灵活性: 它在应用中有着灵活的操作,提高了工作效率 。
- 简化性: 多态简化代码编写 和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
(摘自菜鸟教程以及百度百科。)