本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
5分32秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器 示例 1 : 操作符的多态 示例 2 : 观察类的多态现象 示例 3 : 类的多态条件 示例 4 : 类的多态-不使用多态 示例 5 : 类的多态-使用多态 示例 6 : 练习-多态 示例 7 : 答案-多态
同一个操作符在不同情境下,具备不同的作用
如果+号两侧都是整型,那么+代表 数字相加 如果+号两侧,任意一个是字符串,那么+代表字符串连接 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);
}
}
观察类的多态现象:
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("蓝瓶使用后,可以回魔法");
}
}
如果不使用多态,
假设英雄要使用血瓶和魔瓶,就需要为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);
}
}
如果物品的种类特别多,那么就需要设计很多的方法
比如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);
}
}
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个对象
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
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不是多态吧
2 个答案
alleyf 跳转到问题位置 答案时间:2023-10-09 Domiko 跳转到问题位置 答案时间:2023-08-13 是多态啊,重写指的是LifePotion和MagicPotion都是Item的子类,他们俩都有一个方法是effect(),但是这方法中的效果是不一样的,只是名称一样。多态指的是在传入useItem中的参数类型只有一种,就是父类Item,再得益于向上转型无限制,也就是传入useItem中的是Item类型和它的子类都是没关系的,传进去不同的子类,里面调用的方法都叫effect,但是效果不同(效果不同是在子类定义的时候就产生的),所以叫多态。
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2023-04-03
练习-多态
6 个答案
huazhang 跳转到问题位置 答案时间:2024-07-11 public class Hero {
public String name;
//物品栏的容量
public static int itemCapacity=8; //声明的时候 初始化
static{
itemCapacity = 6;//静态初始化块 初始化
}
public Hero(){
}
public void kill(Mortal m)
{
System.out.println(name + " 放了一个大招" );
m.die();
}
public static void main(String[] args) {
System.out.println(Hero.itemCapacity);
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);
}
}
木宇 跳转到问题位置 答案时间:2024-05-01 打卡
码农人 跳转到问题位置 答案时间: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 条以前的提问,请 点击查看
提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
|