how2j.cn


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

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


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



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



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

示例 1 :

操作符的多态

edit
同一个操作符在不同情境下,具备不同的作用
如果+号两侧都是整型,那么+代表 数字相加
如果+号两侧,任意一个是字符串,那么+代表字符串连接
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 :

观察类的多态现象

edit
观察类的多态现象:
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 :

类的多态条件

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

类的多态-不使用多态

edit
如果不使用多态
假设英雄要使用血瓶和魔瓶,就需要为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 :

类的多态-使用多态

edit
如果物品的种类特别多,那么就需要设计很多的方法
比如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 :

练习-多态

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

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个对象
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 基础总计0个答案 (总共需要0积分)
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 基础总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

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


答案-多态
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公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2023-05-18 示例5不是多态吧
J-JP




示例3说了多态的条件有两个: 1. 父类(接口)引用指向子类对象 2. 调用的方法有重写 但是示例5中没有父类(接口)引用指向子类对象,调用的方法useItem也没有重写,这算是多态吗
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);     
         
    }
       
}

							


2 个答案

alleyf
答案时间:2023-10-09
Domiko
答案时间:2023-08-13
是多态啊,重写指的是LifePotion和MagicPotion都是Item的子类,他们俩都有一个方法是effect(),但是这方法中的效果是不一样的,只是名称一样。多态指的是在传入useItem中的参数类型只有一种,就是父类Item,再得益于向上转型无限制,也就是传入useItem中的是Item类型和它的子类都是没关系的,传进去不同的子类,里面调用的方法都叫effect,但是效果不同(效果不同是在子类定义的时候就产生的),所以叫多态。



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2023-04-03 练习-多态
起个名




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个对象
public interface Mortal {
	public void die();
}

package charactor;

import charactor1.Mortal;

public class ADHero extends Hero implements AD,Mortal{

	@Override
	public void physicAttack() {
		// TODO 自动生成的方法存根
		System.out.println("进行物理攻击");
	}
	
	@Override
	public void die() {
		// TODO 自动生成的方法存根
		System.out.println(this.name + "英雄阵亡,物理元素消亡!");
	}

}

public class APHero extends Hero implements AP,Mortal{

	@Override
	public void magicAttack() {
		System.out.println("进行魔法攻击");
	}

	@Override
	public void die() {
		// TODO 自动生成的方法存根
		System.out.println(this.name + "英雄阵亡,魔法消亡!");
	}

}

public class ADAPHero extends Hero implements  AD,AP,Mortal{

	@Override
	public void magicAttack() {
		System.out.println("进行魔法攻击");
	}

	@Override
	public void physicAttack() {
		System.out.println("进行物理攻击");
	}

	@Override
	public void die() {
		// TODO 自动生成的方法存根
		System.out.println(this.name + "英雄阵亡,物理和魔法随之湮灭!");
	}

}

Hero garen = new Hero();
garen.name = "yase";

ADHero h1 = new ADHero();
h1.name = "AD";
APHero h2 = new APHero();
h2.name = "AP";
ADAPHero h3 = new ADAPHero();
h3.name = "ADAP";

garen.kill(h1);
garen.kill(h2);
garen.kill(h3);

console:
AD英雄阵亡,物理元素消亡!
AP英雄阵亡,魔法消亡!
ADAP英雄阵亡,物理和魔法随之湮灭!

							


4 个答案

码农人
答案时间:2023-11-20
不知阁下怎么看?

JHCCCoder
答案时间:2023-08-15
1. 写完Mortal接口,ADHero,APHero等几个类注意加上这个接口。

加长版海贼
答案时间:2023-08-10
输出: 盖伦杀了射手,ad死了 盖伦杀了法师,ap死了 盖伦杀了法射,adap死了

tiang
答案时间:2023-05-30
public class APHero extends Hero implements AP, Mortal { @Override public void die() { System.out.println(name+"像魔法一样灿烂的消散"); } } public class ADHero extends Hero implements Mortal,AD { @Override public void die() { System.out.println(name+"伴着骄傲的物理一起随风逝去"); } } public class ADAPHero extends Hero implements AD,AP, Mortal { @Override public void die() { System.out.println(name+"终究随着魔法和物理一起消散了"); } } public class Hero { String name; float hp; float armor; int movespeed; public Hero(){ } public void kill(Hero h){ System.out.println(name+"击杀了"+h.name); h.die(); } public void die(){ System.out.println("传奇阵亡"); } public static void main(String[] args) { Hero galon=new Hero(); galon.name="盖伦"; ADHero vn=new ADHero(); APHero xf=new APHero(); ADAPHero police=new ADAPHero(); police.name="女警"; xf.name="小法"; vn.name="薇恩"; galon.kill(vn); galon.kill(xf); galon.kill(police); }



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2022-10-19 输出异常
2022-03-17 这个练习在使用的时候创建对象的时候是不是应该是Hero sige = new APHero();击杀的时候应该是gailun.kill((Mortal) jiansheng);为什么我和大家不一样
2022-01-18 基本


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 62 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 JAVA 基础-接口与继承-多态 的提问

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

上传截图