how2j.cn


工具版本兼容问题
操作符的多态
+ 可以作为算数运算,也可以作为字符串连接

类的多态
父类引用指向子类对象

本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频



5分32秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)



示例 1 : 操作符的多态   
示例 2 : 观察类的多态现象   
示例 3 : 类的多态条件   
示例 4 : 类的多态-不使用多态   
示例 5 : 类的多态-使用多态   
示例 6 : 练习-多态   
示例 7 : 答案-多态   

示例 1 :

操作符的多态

同一个操作符在不同情境下,具备不同的作用
如果+号两侧都是整型,那么+代表 数字相加
如果+号两侧,任意一个是字符串,那么+代表字符串连接
package charactor; public class Hero { public String name; protected float hp; public static void main(String[] args) { int i = 5; int j = 6; int k = i+j; //如果+号两侧都是整型,那么+代表 数字相加 System.out.println(k); int a = 5; String b = "5"; String c = a+b; //如果+号两侧,任意一个是字符串,那么+代表字符串连接 System.out.println(c); } }
示例 2 :

观察类的多态现象

观察类的多态现象:
1. i1和i2都是Item类型
2. 都调用effect方法
3. 输出不同的结果

多态: 都是同一个类型,调用同一个方法,却能呈现不同的状态
观察类的多态现象
package property; public class Item { String name; int price; public void buy(){ System.out.println("购买"); } public void effect() { System.out.println("物品使用后,可以有效果 "); } public static void main(String[] args) { Item i1= new LifePotion(); Item i2 = new MagicPotion(); System.out.print("i1 是Item类型,执行effect打印:"); i1.effect(); System.out.print("i2也是Item类型,执行effect打印:"); i2.effect(); } }
package property; public class LifePotion extends Item { public void effect(){ System.out.println("血瓶使用后,可以回血"); } }
package property; public class MagicPotion extends Item{ public void effect(){ System.out.println("蓝瓶使用后,可以回魔法"); } }
示例 3 :

类的多态条件

要实现类的多态,需要如下条件
1. 父类(接口)引用指向子类对象
2. 调用的方法有重写
那么多态有什么作用呢? 通过比较不使用多态使用多态来进一步了解
示例 4 :

类的多态-不使用多态

如果不使用多态
假设英雄要使用血瓶和魔瓶,就需要为Hero设计两个方法
useLifePotion
useMagicPotion


除了血瓶和魔瓶还有很多种物品,那么就需要设计很多很多个方法,比如
usePurityPotion 净化药水
useGuard 守卫
useInvisiblePotion 使用隐形药水
等等等等
package charactor; import property.LifePotion; import property.MagicPotion; public class Hero { public String name; protected float hp; public void useLifePotion(LifePotion lp){ lp.effect(); } public void useMagicPotion(MagicPotion mp){ mp.effect(); } public static void main(String[] args) { Hero garen = new Hero(); garen.name = "盖伦"; LifePotion lp =new LifePotion(); MagicPotion mp =new MagicPotion(); garen.useLifePotion(lp); garen.useMagicPotion(mp); } }
示例 5 :

类的多态-使用多态

如果物品的种类特别多,那么就需要设计很多的方法
比如useArmor,useWeapon等等

这个时候采用多态来解决这个问题
设计一个方法叫做useItem,其参数类型是Item
如果是使用血瓶,调用该方法
如果是使用魔瓶,还是调用该方法
无论英雄要使用什么样的物品,只需要一个方法即可
package charactor; import property.Item; import property.LifePotion; import property.MagicPotion; public class Hero { public String name; protected float hp; public void useItem(Item i){ i.effect(); } public static void main(String[] args) { Hero garen = new Hero(); garen.name = "盖伦"; LifePotion lp =new LifePotion(); MagicPotion mp =new MagicPotion(); garen.useItem(lp); garen.useItem(mp); } }
示例 6 :

练习-多态

Or  姿势不对,事倍功半! 点击查看做练习的正确姿势

immortal是不朽的,不死的意思
mortal就是终有一死的,凡人的意思

1. 设计一个接口
接口叫做Mortal,其中有一个方法叫做die
2. 实现接口
分别让ADHero,APHero,ADAPHero这三个类,实现Mortal接口,不同的类实现die方法的时候,都打印出不一样的字符串
3. 为Hero类,添加一个方法,在这个方法中调用 m的die方法。

public void kill(Mortal m)

4. 在主方法中
首先实例化出一个Hero对象:盖伦
然后实例化出3个对象,分别是ADHero,APHero,ADAPHero的实例
然后让盖伦 kill 这3个对象
示例 7 :

答案-多态

在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

3分49秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)


答案-多态
package charactor; public interface Mortal { public void die(); }
package charactor; public class ADHero extends Hero implements AD ,Mortal{ @Override public void physicAttack() { } @Override public void die() { System.out.println(name+ " 这个物理英雄挂了"); } }
package charactor; public class APHero extends Hero implements AP,Mortal { public void magicAttack() { } @Override public void die() { System.out.println(name+ " 这个魔法英雄挂了"); } }
package charactor; public class ADAPHero extends Hero implements AD,AP,Mortal{ @Override public void magicAttack() { // TODO Auto-generated method stub } @Override public void physicAttack() { // TODO Auto-generated method stub } @Override public void die() { System.out.println(name+ " 这个混合英雄挂了"); } }
package charactor; public class Hero { public String name; protected float hp; public void kill(Mortal m){ System.out.println(name + " 放了一个大招" ); m.die(); } public static void main(String[] args) { Hero h =new Hero(); h.name = "盖伦"; ADHero ad = new ADHero(); ad.name = "艾希"; APHero ap = new APHero(); ap.name = "安妮"; ADAPHero adap = new ADAPHero(); adap.name = "库奇"; h.kill(ad); h.kill(ap); h.kill(adap); } }
package charactor; public interface AD { public void physicAttack(); }
package charactor; public interface AP { public void magicAttack(); }


HOW2J公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2018-07-03 接口是多态的最好体现
Cscar



接口和多态
interface Mortal{
    public void die();
}

class ADHero implements Mortal{
    public void die(){
        System.out.println("AD死亡");
    }
}

class APHero implements Mortal{
    public void die(){
        System.out.println("AP死亡");
    }
}

class ADAPHero implements Mortal{
    public void die(){
        System.out.println("ADAP死亡");
    }
}

public class Hero {

    String name;

    Hero(String name){
        this.name=name;
    }

    public void kill(Mortal m){
        System.out.println(name+"开大");
        m.die();
    }

    public static void main(String[] args) {
        Hero g = new Hero("盖伦");
        Mortal ad = new ADHero();
        Mortal ap = new APHero();
        Mortal adap = new ADAPHero();
        g.kill(ad);
        g.kill(ap);
        g.kill(adap);

    }
}

							


2 个答案

lzt501 答案时间:2018-07-16
package com.stly7.eland.oop.ployimortic; public class TestHero { public static void main(String[] args) { Hero g = new Hero("盖伦"); /* * Hero ad = new ADHero(); Hero ap = new APHero(); Hero adap = new ADAPHero(); */ //意思就是接口多态了 //上面内容是对的,下面内容也是对的 Mortal ad = new ADHero(); Mortal ap = new APHero(); Mortal adap = new ADAPHero(); g.kill(ad); g.kill(ap); g.kill(adap); } }

eskii 答案时间:2018-07-09




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-06-01 交作业呀交作业
powersn



package lol; public class Hero { String name; float hp; float armor; int moveSpeed; public Hero() { } public Hero(String name, float hp) { this.name = name; this.hp = hp; } public void kill(Mortal... mortals) { for (int i = 0; i < mortals.length; i++) { mortals[i].die(); } } public static void main(String[] args) { Hero gr = new Hero(); ADHero ad = new ADHero("亚瑟",500); APHero ap = new APHero("安琪拉",380); ADAPHero adap = new ADAPHero("后羿",380); gr.kill(ad,ap,adap); } } class ADHero extends Hero implements Mortal { public ADHero() { } public ADHero(String name, float hp) { super(name, hp); } public void die() { System.out.println(this.name + "十八年后还是一条好汉"); } } class APHero extends Hero implements Mortal { public APHero() { } public APHero(String name, float hp) { super(name, hp); } public void die() { System.out.println(this.name + "魔法永不熄灭"); } } class ADAPHero extends Hero implements Mortal { public ADAPHero() { } public ADAPHero(String name, float hp) { super(name, hp); } public void die() { System.out.println(this.name + "我还会回来的"); } }
public  interface Mortal {
	public  void die();
}

							


2 个答案

猫猫咪呀 答案时间:2018-06-22
你的接口呢,方法也没有你调用个屁啊,

南哥 答案时间:2018-06-03




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-05-18 这个例子是怎么体现多态的?
2018-05-16 交作业,老师帮忙看一下,这样写可以吗?
2018-05-03 交作业
2018-04-20 交作业-打卡
2018-04-15 站长大大,提问一下作业
2018-03-28 name的传值问题
2018-01-27 交作业..
2018-01-27 交一份作业
2018-01-02 提交作业(多态的作用)-------能一看就明白多态的作用,看后你就能理解,简单方便
2017-12-13 交一份作业
2017-12-03 作业 ,看下对不对
2017-11-27 作业
2017-11-18 关于为什么使用重写和多态的 讲解 很棒。。
2017-11-15 关于kill( Mortal m)与 h=kill(ap)
2017-11-10 main方法???主方法也可以写在子类里面.......
2017-09-02 想要输出“盖伦击杀了库奇这个混合英雄”该怎么写呢?
2017-08-01 站长大大,能解释一下此处接口Mortal的作用吗?
2017-07-12 作业
2017-07-11 交作业了----多态
2017-06-24 父类引用指向子类对象,不是很理解
2017-05-23 学习交流
2017-04-26 主函数调kill方法时候报错The method kill(Mortal) in the type Hero is not applicable for the arguments (Hero)
2017-04-15 看了答案还是不太懂具体代码是怎么运行的,在mian方法里是怎么一步步调用的
2017-03-21 接口只能单独放在.java文件中吗
2016-12-18 请问各位大佬,public void kill(Mortal m)中的Mortal m是代表什么?
2016-10-29 示例5的20,21行不是父类对象引用指向子类引用呀
2016-07-23 几个类名不对,LifePotion和LifePortion MagicPotion和MagicPortion




提问之前请登陆
关于 JAVA 基础-接口与继承-多态 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 620943819
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: http://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图