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

首先我来说一下多态这个名字是什么意思,多态的英文词是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中很重要的一个特性。(在我看来这是有了封装和继承的特性之后才有的一个特性。)

}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yxnchinahlj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值