多态: 都是同一个类型,调用同一个方法,却能呈现不同的状态
这主要体现在 将父类引用变量可以指向子类空间,当指向不同子类空间时,则调用同一个方法,有不同结果。
(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(); |