从一个例子理解多态(附代码解释)

来源:互联网 发布:淘宝天猫优惠券招代理 编辑:程序博客网 时间:2024/05/17 23:25

首先我来说一下多态这个名字是什么意思,多态的英文词是polymorphism,poly的意思是许多,morph的意思是形态。所以多态的意思说白了就是许多形态。那么这许多形态是指谁的形态呢,它是说不同对象有着相同轮廓,但是在执行的时候会表现出多种的姿态。用我的例子来说,网络游戏中的诸多角色,如法师和战士。他们的类中都应该有一个跑的方法,但是跑起来的样子却并不一样。为了解释这个问题,我下面提供了一段代码。

这个例子中有一个Ren类
public class Ren {

 private String name;
 private String sex;
 
 public void run(){
  
 }
}


MT(战士)类
public class MT extends Ren{

 @Override
 public void run() {
  System.out.print("战士跑");
 }
}

FS(法师)类
public class FS extends Ren{

 @Override
 public void run() {
  System.out.print("法师跑"); 
 }
 
 
}
 

Run类
public class Run {
 public void niPao(Ren r){
  r.run();
 }

}

Test类

public class Test {

 /**
  * @param args
  */
 public static void main(String[] args) {
  /*
   多态性是允许将父对象设置成为和一个或多个它的子对象相等的技术,
   比如Parent:=Child; 多态性使得能够利用同一类(基类)
   类型的指针来引用不同类的对象,以及根据所引用对象的不同 ,
   以不同的方式执行相同的操作.
   多态的作用:把不同的子类对象都当作父类来看,
   可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,
   以适应需求的不断变化。
   */
  MT m1=new MT();
  FS f1=new FS();
  FS f2=new FS();
  
  Run r=new Run();
  //如果是法师1
  r.niPao(f1);
  //如果是法师2
  r.niPao(f2);
  //如果是战士1;
  r.niPao(m1);

 }

}

运行Test类出现的结果是 法师跑,法师跑,战士跑。可见体现了多态性的同样的轮廓,不同种姿态的特性。

这是说明多态名字为什么这么叫,但是这样的名字有什么好处呢。好处是可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

最重要的是适应不断需求的变化,假设这个游戏随着玩的人越来越多,想要多设一个角色GJS,那么此时,我们需要做的只是加一个弓箭手类如下,而并不需要多修改别处的代码。然后我们再在Test类中测试,看会出现什么结果
public class GJS extends Ren{

 @Override
 public void run() {
  
  System.out.print("弓箭手跑");
 }
}

public class Test {

 /**
  * @param args
  */
 public static void main(String[] args) {

  MT m1=new MT();
  FS f1=new FS();
  FS f2=new FS();
  
  GJS g=new GJS();
  Run r=new Run();
  //如果是法师1
  r.niPao(f1);

  //如果是法师2
  r.niPao(f2);

  //如果是战士1;
  r.niPao(m1);
 //如果是弓箭手
  r.niPao(g);
 }

在运行的结果中我们会发现最后的一项是弓箭手的一项。

这样利用多态性,我们对这个游戏实现了一个完美的扩展,在尽量少的修改(甚至不修改)原有的代码的基础上,实现了我们要干的事情。这是一件了不起的事情。在我们慢慢做一些项目,开始一些开发的时候会发现这一个特性会改变许多事情。多态性,不亏是OOP中很重要的一个特性。(在我看来这是有了封装和继承的特性之后才有的一个特性。)

}