多态(polymorphism): 不同的对象,调用同一个方法,对象的行为状态可能完全不同,也就是说,有多种状态,这种情况就叫做多态。
以下的例子里,同样都是人吃饭这个方法,但是不同的人使用吃饭这个方法时,行为可能完全不同,也就是说,有多种吃饭状态。
以下用示例代码来说明:
package polymorphism;public class Animal { //定义一个Animal作为父类public void shout (){ //定义父类里的一个方法System.out.println("动物叫");}
}
class Dog extends Animal{ //定义了一个Dog子类public void shout(){System.out.println("旺旺旺!");//针对dog重写了父类animal里的shout方法}public void seeDoor(){System.out.println("看门中。。。");}
}class Cat extends Animal{//定义了一个cat子类public void shout(){System.out.println("喵喵喵!");//针对cat重写了父类animal里的shout方法}
}package polymorphism;public class TestPolym {public static void main(String[] args) {animalCry(new Dog());//实参是子类对象doganimalCry(new Cat());//实参是子类对象dog}static void animalCry(Animal a){ //形参是父类Animal 的对象aSystem.out.println("TestPolym.animalCry");a.shout();//虽然在这里看到的是同一个shout方法//但会根据实际的传入的Animal的不同(dog或者cat)而运行其子类重写shout方法//这就是所谓的多态}
}
运行结果:
多态的要点:
1.多态是方法的多态,不是属性的多态(多态与属性无关)。
在上面的示例中,与多态有关的都是方法,而不是变量或属性,这很明显。
2.多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象。
在上面的示例中,要实现多态,继承,方法重写都出现了,这很明显。
而父类引用指向子类对象,很明显就是:
(Animal a){ //形参是父类Animal 的对象a
但是实际引用时,传入的是子类对象:
animalCry(new Dog());//实参是子类对象dog animalCry(new Cat());//实参是子类对象dog
这就是所谓父类引用指向子类对象。
3.父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。
在上面的示例中,就是这一段:
a.shout();//虽然在这里看到的是同一个shout方法//但会根据实际的传入的Animal的不同(dog或者cat)而运行其子类重写shout方法//这就是所谓同一个父类方法,在运行不同子类对象时,呈现多种状态(多态)
引入多态,降低了不同类不同代码块之间的耦合,方便后续的修改和维护。这可以通过设想这种情况来理解:如果没有这种多态机制,要实现同样的效果,只能够分别调用子类对象来做,那么每次修改子类,TestPolym类都要同步做修改。