多态: 都是同一个类型,调用同一个方法,却能呈现不同的状态
这主要体现在 将父类引用变量可以指向子类空间,当指向不同子类空间时,则调用同一个方法,有不同结果。
(1)父类引用变量实现多态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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(); //LifePotion的方法与 MagicPotion的方法不一样
Item i2 = new MagicPotion(); // 因此这里体现多态
System.out.print( "i1 是Item类型,执行effect打印:" );
i1.effect();
System.out.print( "i2也是Item类型,执行effect打印:" );
i2.effect();
}
}
如果一个方法的输入参数为 父类类型,则 子类对象也可以成功输入,这也体现了多态。
但是在 父类引用变量(实际指向子类空间) 只能执行 父类中定义过的方法(可以被重载)和父类定义过的实例变量。不能执行父类没有定,
但是子类中定义过的方法。
(2) 接口实现多态(接口也相当于一个类 也会有自己的引用变量)
public class StartGame { public static void main(String[] args){ Hero character1=new Hero(); APHero character2=new APHero(); ADHero character3=new ADHero(); ADAPHero character4=new ADAPHero(); character1.kill(character2); character1.kill(character3); character1.kill(character4); } } class Hero { String name; float hp; float armor; int moveSpeed; public void kill (Mortal m){ // 以接口的Mortal 类型作为引用变量 实现多态 m.die(); // 因为 ADHero、APHero、ADAPHero 执行Mortal } // 方法 所以赋给 接口引用变量m } class ADHero extends Hero implements Mortal{ // ADHero 继承Hero 执行 Mortal 接口 public void die(){ System.out.println("ADHero die"); } } class APHero extends Hero implements Mortal{ // APHero 继承Hero 执行 Mortal接口 public void die(){ System.out.println(" APHero die"); } } class ADAPHero extends Hero implements Mortal{ // ADAPHero 继承 Hero 执行 Mortal接口 public void die(){ System.out.println(" APADHero die"); } } interface Mortal{ // Mortal 接口定义 空方法 public void die(); |