什么是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视频教程!
以上就是什么是java多态?java多态的使用的详细内容,更多请关注其它相关文章!
上一篇: 支付宝的改版与野心,你要是认为阿里要做社交你就错了
下一篇: Dubbo 一些你会忽略的却好用的功能
推荐阅读
-
java中finally块儿是怎么工作的?有什么意义?
-
Java中是使用增强for的null问题
-
Java : 多态表现:静态绑定与动态绑定(向上转型的运行机制)
-
微信小程序授权 获取用户的openid和session_key【后端使用java语言编写】,我写的是get方式,目的是测试能否获取到微信服务器中的数据,后期我会写上post请求方式。
-
学习 JAVA,有什么书籍推荐?学习的方法和过程是怎样的?
-
理解java的三大特性之多态
-
java基础 静态 static 问在多态中,子类静态方法覆盖父类静态方法时,父类引用调用的是哪个方法?
-
Java农夫过河问题的继承与多态实现详解
-
Java开发笔记(五十一)多态的发生场景
-
Java必须学会的类的继承与多态