1、多态(动态绑定)
动态绑定是指在运⾏期间,判断所引⽤对象的实际类型,根据其实际的类型调⽤相应的⽅法,多态即:⼀个对象具有多种状态的⾏为。
1.1、多态的3个必要条件
要有继承
要有重写
父类的引用指向子类的对象
1.2、方法重写的案例回顾
动物类
public class Animal {
public void speek(){
System.out.println("动物都会叫");
}
}
狗类,继承自动物类
class Dog extends Animal {
/**
* 重写父类的speek方法
*/
@Override
public void speek() {
System.out.println("我是狗,旺旺旺...");
}
}
猫类,继承自动物类
class Cat extends Animal {
/**
* 重写父类的speek方法
*/
@Override
public void speek() {
System.out.println("我是猫,喵喵喵...");
}
}
1.3、完善案例实现多态性
public class Test {
public static void main(String[] args) {
Dog d = new Dog();
Cat c = new Cat();
Animal ani = null;
ani = d; //动物变成了狗
ani.speek(); //我是狗,旺旺旺...
ani = c; //动物变成了猫
ani.speek(); //我是猫,喵喵喵...
}
}
2、对象转型
2.1、向上转型
父类的引用指向子类的对象,称为向上转型
2.1.1、回顾多态的案例
public class Test {
public static void main(String[] args) {
Dog d = new Dog();
Cat c = new Cat();
Animal ani = null;
ani = d; //动物变成了狗
ani.speek(); //我是狗,旺旺旺...
ani = c; //动物变成了猫
ani.speek(); //我是猫,喵喵喵...
}
}
代码中将父类的引用指向了子类的对象,该写法是对象的向上转型;向上转型是自动的。
2.2、向下转型
2.2.1、回顾多态的案例,并修改main方法
public class Test2 {
public static void main(String[] args) {
Dog jinMao = new Dog();
Animal ani = jinMao;
Dog erHa = (Dog) ani; //向下转型
}
}
代码中将子类的引用指向了父类的对象,该写法是对象的向下转型;向下转型不是自动的,需要强制类型转换符进行转换。
3、经典案例——木兰从军
3.1、需求分析
该案例中需要3个类,分别是父亲类Father.java,女儿类Daughter.java,还有一个测试类Test.java
3.2、代码实现
Father.java
package test;
public class Father {
public String name;
public int age;
public void fight(){
System.out.println("我是花弧我要去打仗");
}
}
Daughter.java
package test;
public class Daughter extends Father {
@Override
public void fight() {
System.out.println("姓名:"+name);
System.out.println("年龄:"+age);
System.out.println("我是女儿,我替父从军");
}
public void dressup(){
System.out.println("姓名:"+name);
System.out.println("年龄:"+age);
System.out.println("我是女儿,我要画一个美美的妆");
}
}
Test.java
package test;
public class Test {
public static void main(String[] args) {
// 女扮男装,转型父亲的角色去征兵打仗
Daughter mulan = new Daughter();
mulan.name = "花木兰";
mulan.age = 18;
//花木兰替父从军(向上转型)
Father huaHu = mulan;
mulan = null;
huaHu.fight();; // 征兵打仗
// 得胜回朝
System.out.println("****得胜回朝*****");
// 之前转型父亲角色的花木兰重新转型为女儿角色(强制向下转型)
mulan = (Daughter) huaHu;
huaHu = null;
mulan.dressup(); // 梳妆打扮
}
}