何为多态?四个字:多种形态。“多态”(Polymorphism)从另一个角度将接口从具体的实施细节中分离出来,亦即实现了“是什么”与“怎样做”两个模块的分离。利用多态性能创建“易于扩展”的程序,无论在项目的创建过程中,还是在需要加入新特性的时候,它们都可以方便地“成长”。
举个现实中的例子,“人”,有多种角色(形态),在老婆面前,他是“老公”,在父亲面前,他是“儿子”,在儿子面前,他是“老爸”,在学生面前,他是“老师”…,“人”具有多种形态,对于“人”的不同的形态,将会说不同的话,做不同的事。
现在定义一个接口,IPeople,定义两个方法talk()和work(),说话和做事,我们知道,“人”在不同的形态(角色)下肯定会做不同的事情,说不同的话,比如:
1) 如果是“老公”,会对老婆说“我爱你”,会履行老公做的事情,比如“拖地”。
2) 如果是“儿子”,会对父亲说“工作辛苦了”,会履行儿子做的事情,比如“回家看看”。
3) 如果是“老爸”,会对儿子说“好好学习”,会履行老爸做的事情,比如“送儿子上学”。
4) 如果是“老师”,会对学生说“多态是什么”,会履行老师做的事情,比如“备课”。
这些角色和对应的说的话做的事都不一样,但是它们都可以实现接口IPeople中定义的方法talk()和work()。
“人”可以有很多角色,为讲解简单,我们取“老公”和“老师”这两个角色来进行代码演示即可。
首先定义接口及方法:
package code; public interface IPeople { public void talk(); public void work(); } |
接着定义“老公”类实现该接口:
package code; public class Husband implements IPeople { public void talk() { System.out.println("I love you ..."); } public void work() { System.out.println("Let me clean ..."); } } |
然后定义“老师”类实现该接口:
public class Teacher implements IPeople { public void talk() { System.out.println("What's Polymorphism ..."); } public void work() { System.out.println("Prepare the RFT material ..."); } } |
到目前为止,与上一节讲的接口一样,没有什么特别之处,多态的重点表现在如下这段代码中:
package com.learn.oop; class DoThing { public IPeople people; public void start() { people.talk(); people.work(); } } public class Qiang { public static void main(String[] args) { Husband husband = new Husband(); DoThing doThing = new DoThing(); doThing.people = husband; doThing.start(); } } |
首先定义了一个内部类叫DoThing(只是为了直观定义成内部类,与将该类定义到另外一个文件中没有本质差别),DoThing定义一个接口型变量people,那么start()方法中就可以直接用这个接口变量people来调用接口中的方法talk()和work()了。接下来在主调类Qiang中将Husband类的实例husband赋值给DoThing的people变量,这样people接口变量就拥有了实例,可以直接做start()方法中的talk()和work()这两件事情了。如果我们想让DoThing类的start ()方法做Teacher的事情,只需要将Teacher的实现赋值给doThing.people即可,这就是多态。同时,假如我们还要对IPeople扩展“父亲”的角色,只需要新增类Father就行了,DoThing这个类不用做任何改动,提高代码的维护性和重用性。我们可以不用关注类是怎么做的,而只关注我要做什么。
下面的代码演示了如何使用动态传递参数值的方式来进行多态实例化,与上例原理一致,只不过更多的关注在如何通过“字符串型的类名”来进行类的实例化 (注意使用throws Exception抛出异常):
package code; public class Qiang { public static void main(String[] args) throws Exception { String type = "code.Teacher"; Class peoplec = Class.forName(type); Object peopleo = peoplec.newInstance(); IPeople people = (IPeople) peopleo; people.talk(); people.work(); } } |
注:此处由于Teacher这个类在包code中,在使用Class.forName动态生成类时需要给定完整的包名和类名,如code.Teacher,关于JAVA中“包”的用法,请读者朋友自行阅读相关材料。
蜗牛学院,只为成就更好的你!
你!敢不敢!用你三个月的时间,换你不一样的未来!
赶快关注蜗牛学院官方微信,了解更多信息吧!