什么是java多态?java多态的使用

如果下载的源码需要作者授权,请更换源码。本站免费分享资源不会增加授权

本篇文章给大家带来的内容是什么是java多态 ?java多态的使用,通过游戏中的一些功能带你掌握多态的使用。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所助。

为什么要使用多态

在一款对战类游戏中(如有雷同纯属巧合),有两个不同的法师英雄:小乔、妲己。
两个法师英雄的都有攻击的方法,小乔的攻击伤害为10,消耗魔法20。妲己的攻击伤害为15,消耗魔法30。玩家可以操作两个英雄进行攻击,下面看看实现的代码。

父类-英雄:whyusepolymorphic.Hero.java

package whyusepolymorphic;  public class Hero {     private int magicPoint;//魔法值     private int hurt;//伤害     private String name;//姓名          public Hero(int magicPoint, int hurt, String name) {         super();         this.magicPoint = magicPoint;         this.hurt = hurt;         this.name = name;     }      public int getMagicPoint() {         return magicPoint;     }      public void setMagicPoint(int magicPoint) {         this.magicPoint = magicPoint;     }          //省略属性的 getter 和 setter 方法 }

子类-小乔:whyusepolymorphic.LittleJoe.java

package whyusepolymorphic;  public class LittleJoe extends Hero {      public LittleJoe(int magicPoint, int hurt, String name) {         super(magicPoint, hurt, name);     }      //攻击的方法     public void attack() {         System.out.println(this.getName()+" 发动攻击,伤害为:"+this.getHurt()         +"。消耗 20的魔法值");         this.setMagicPoint(getMagicPoint()-20);//魔法值-20     }  }

子类-妲己:whyusepolymorphic.Daji.java

package whyusepolymorphic;  public class Daji extends Hero{      public Daji(int magicPoint, int hurt, String name) {         super(magicPoint, hurt, name);     }          public void attack() {         System.out.println(this.getName()+" 发动攻击,伤害为:"+this.getHurt()         +"。消耗 30的魔法值");         this.setMagicPoint(getMagicPoint()-30);//魔法值-30     } }

玩家:whyusepolymorphic.Player.java

package whyusepolymorphic;  public class Player {     public void play(LittleJoe littleJoe) {         littleJoe.attack();     }     public void play(Daji daji) {         daji.attack();     } }

上面代码完整的实现了要求中的功能,那我们知道英雄不可能就这几个,后期如果添加新的魔法英雄,伤害不一样,怎么办?

我们可以添加新的类,实现攻击的方法,修改玩家类添加操作英雄的方法。这个方式可以完成 Hero 扩展的需求,但是后面有更多的 Hero 添加进来,我们维护起来就不是那么方便了。

研究上面的代码我们发现,Player 类中的 play 方法的参数都是 Hero 类的子类,能否使用一个 play(Hero hero) 方法操作所有的英雄?使用多态就能够实现这种优化设计。

什么是多态

简明扼要,多态就是多种形态。在自然界中碳的多态就有石墨、钻石等,剪这个动作就有剪纸、剪头发等。同一个操作,由于条件的不同,产生的结果也不同。

那么在程序中的多态,就是指同一个引用类型,使用不同的实例而执行不同的操作(父类引用指定子类对象 Hero h=new Daji();)。

如何实现多态

实现多态的步骤:

1.编写具有继承关系的父类和子类

2.子类重写父类方法

3.使用父类的引用指向子类的对象

父类作为方法形参实现多态

使用多态优化上面代码

修改 Hero.java 添加攻击的方法

package whyusepolymorphic;  public class Hero {     //省略属性和构造方法          //攻击的方法     public void attack() {         System.out.println(this.getName()+" 发动攻击,伤害为:"+this.getHurt()         +"。消耗 20的魔法值");         this.setMagicPoint(getMagicPoint()-20);//魔法值-20     }     //省略 getter 和 setter 方法 }

两个子类不用修改

修改玩家类 Player.java 将 play方法的参数设为父类

package whyusepolymorphic;  public class Player {     public void play(Hero hero) {         hero.attack();     } }

修改测试类

package whyusepolymorphic;  public class TestPlay {     public static void main(String[] args) {         Player p=new Player();         Hero daji=new Daji(100,15,"妲己");         p.play(daji);         System.out.println(daji.getName()+" 剩余魔法:"+daji.getMagicPoint());         Hero littleJoe=new LittleJoe(100,10,"小乔");         p.play(littleJoe);         System.out.println(littleJoe.getName()+" 剩余魔法:"+littleJoe.getMagicPoint());     } }

父类作为返回值实现多态

玩家购买英雄使用多态实现,购买的方法有返回值,返回购买后的英雄,父类作为返回值实现这个功能。

修改玩家类 Player.java 添加获取英雄的方法

package whyusepolymorphic;  public class Player {     public void play(Hero hero) {         hero.attack();     }          public Hero getHero(int id) {         if(1==id) {             return new Daji(100,15,"妲己");         }else if(2==id){             return new LittleJoe(100,10,"小乔");         }else {             System.out.println("没有这个英雄");             return null;         }     } }

测试类

package whyusepolymorphic;  import java.util.Scanner;  public class TestPlay {     public static void main(String[] args) {         Player p=new Player();         System.out.println("欢迎来到英雄商店,请选择要购买的英雄:1.妲己2.小乔");         Scanner input=new Scanner(System.in);         int id=input.nextInt();         Hero h=p.getHero(id);         if(null!=h) {             h.attack();         }     } }

父类到子类的转换

如果子类中有一些子类特有的方法,父类引用不能调用子类的特有的方法。

向 Daji.java 中添加一个方法 queenWorship

package whyusepolymorphic;  public class Daji extends Hero{     //省略构造方法及之前其他方法     public void queenWorship() {         System.out.println("释放大招:女王崇拜");     } }

向 LittleJoe.java 中添加一个方法 dazzlingStar

package whyusepolymorphic;  public class LittleJoe extends Hero {     //省略构造方法及之前其他方法     public void dazzlingStar() {         System.out.println("释放大招:星华缭乱");     } }

在 Player.java 中添加 bigMove 方法

package whyusepolymorphic;  public class Player {     //省略构造方法及之前其他方法     public void bigMove(Hero hero) {         hero.dazzlingStar();     } }

发现代码 hero.dazzlingStar(); 报错

那么这个时候就需要将父类转换为子类(强制类型转换)

Hero joe=new LittleJoe(100,10,"小乔"); Daji daji=(Daji) joe;

但是直接这样写也会报错,用 instanceof 运算符可以保证不会转换错误

语法:

对象 instanceof 类或接口

instanceof通常和强制类型转换结合使用

修改 Player.java 中的 bigMove 方法

public void bigMove(Hero hero) {         if (hero instanceof Daji) {             ((Daji)hero).queenWorship();         }else if(hero instanceof LittleJoe) {             ((LittleJoe)hero).dazzlingStar();         }     }

在 main 方法中编写测试代码

Player p=new Player(); p.bigMove(new LittleJoe(100,10,"小乔")); p.bigMove(new Daji(100,15,"妲己"));

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。更多相关教程请访问Java视频教程,java开发图文教程,bootstrap视频教程!

本文由(壳先生)整理自网络,如转载请注明出处:https://www.mrshell.com;
本站发布的内容若侵犯到您的权益,请邮件联系 i@mrshell.com 删除,我们将及时处理!
===========================================================================

1. 本站大部分下载资源收集于网络,不保证其完整性以及安全性,请下载后自行测试。
2. 本站资源仅供学习和交流使用,版权归资源原作者所有,请在下载后24小时之内自觉删除。
3. 不得使用于非法商业用途,商用请支持正版!不得违反国家法律,否则后果自负!
4. 若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,与本站无关。
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!

=================================================================

壳先生 » 什么是java多态?java多态的使用

发表评论

提供最优质的资源集合

立即查看 了解详情