一、多态
1、操作符多态
package ia4_polymorphism;
public class Introduce {
public static void main(String[] args) {
// 什么是多态?
// 1-操作符多态 同一事物表现不同形态(功能)
// +
// 加法,可以是数字相加,字符串连接,主要看参与运算的是什么数据
int a = 2;
int b = 3;
int k = a + b; // 参与运算的数据都是整数,数字相加
System.out.println("K = " + k);
String x = "Happy";
int y = 5;
String m = x + y; // 参与运算的任意一个数据为字符串,字符串连接
System.out.println("m = " + m);
}
}
2、类多态
package ia4_polymorphism;
public class Item {
protected String name;
protected float price;
public void buy() {
System.out.println("买买买");
}
public void effect() {
System.err.println("物品使用后,可以有效果");
}
public static void main(String[] args) {
// 2-类多态
// 父类(接口)引用指向子类对象
// 2-1 类多态
Item it1 = new LifePotion();
Item it2 = new MagicPotion();
it1.effect();
it2.effect();
// it1、it2都是Item类,调用effect方法,输出不同结果
// it1引用指向LifePotion对象
// it2引用指向MagicPotion对象
// 2-2 条件
// 父类(接口)引用指向子类对象
// 方法重写,子类重写父类方法
}
}
package ia4_polymorphism;
public class LifePotion extends Item {
public void effect() {
System.out.println("血瓶使用后,可以回血");
}
}
package ia4_polymorphism;
public class MagicPotion extends Item {
public void effect() {
System.out.println("蓝瓶使用后,可以回魔法");
}
}
二、为什么用多态?
1、不使用多态
package ia4_polymorphism2;
import ia4_polymorphism.LifePotion;
import ia4_polymorphism.MagicPotion;
public class Hero {
protected 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);
// 净化药水,隐身药水,护甲,武器等等都需要一个方法,Hero类混乱不堪
}
}
2、使用多态
package ia4_polymorphism3;
import ia4_polymorphism.Item;
import ia4_polymorphism.LifePotion;
import ia4_polymorphism.MagicPotion;
public class Hero {
protected String name;
protected float hp;
// 不管要使用什么物品,一个方法通通搞定
// 只要满足多态条件即可
public void useItem(Item it) {
it.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);
}
}
三、练一练
接口引用指向子类对象情况
1、Mortal接口,die方法;
2、ADHero、APHero、ADAPHero实现Mortal接口,并提供die方法,输出不同字符串;
3、Hero类中定义kill方法,通过多态分别kill上面三个英雄;
public void kill(Mortal m)
部分代码:
package ia4_polymorphism4;
public class Hero {
protected String name;
protected float hp;
public void kill(Mortal m) {
m.die();
}
public static void main(String[] args) {
Hero garen = new Hero();
garen.name = "盖伦";
ADHero ad = new ADHero();
APHero ap = new APHero();
ADAPHero adap = new ADAPHero();
garen.kill(ad);
garen.kill(ap);
garen.kill(adap);
}
}
我的学习源泉:https://how2j.cn/k/interface-inheritance/interface-inheritance-polymorphic/315.html?p=114999
Java自学网站:https://how2j.cn?p=114999