概念
多态是同一个行为具有多个不同表现形式或形态的能力。
体现:同一个接口,使用不同的实例而执行不同操作
实现
将父类作为方法的形参,将子类的对象作为方法的实参,从而实现多态。
方式一:重写
方式二:接口
方式三:抽象类和抽象方法
实例
自动类型转换(向上转型)
案例:主人与宠物玩耍、喂养
- 主人类:Master
- 宠物类:Pet --> Dog、Cat
- 食物类:Food --> Bone、Fish
宠物类:
public class Pet {
String name;
String sex;
public Pet {
super()
}
public Pet (String name, String sex) {
this.name = name;
this.sex = sex;
}
public void show () {
System.out.println("这是一只宠物");
}
public void play () {
System.out.println("这是一只宠物");
}
}
Dog类:
通过重写父类的方法实现多态
public class Dog extends Pet {
String hobby;
public Dog {
super();
}
public Dog (String name, String sex, String hobby) {
super()
this.hobby = hobby;
}
@override
public void show () {
System.out.println("这是一只狗狗,名叫" + name);
}
@override
public void play () {
System.out.println(name + "正在接飞盘...");
}
}
public class Cat extends Pet {
String breed;
public Cat {
super();
}
public Cat (String name, String sex, String breed) {
super()
this.breed = breed;
}
@override
public void show () {
System.out.println("这是一只猫猫,名叫" + name);
}
@override
public void play () {
System.out.println(name + "正在走猫步...");
}
}
主人类:
public Master {
String name;
public Master {
super();
}
public Master(String name) {
super();
this.name = name;
}
/*
public void play (Dog dog) {
dog.play()
}
public void play (Cat cat) {
cat.play()
}
...
*/
// 代替为
public void play (Pet pet) {
pet.play()
}
// 将父类作为方法的形参(将Pet作为play方法的形参),将子类的对象作为方法的实参(将dog、cat作为play的实参),从而实现多态。
}
测试:
public Test {
public staic void main(String[] args) {
Master master = new Master("唐伯虎");
Dog dog = new Dog("旺财", "公", "玩游戏");
master.play(dog);
Dog cat = new Cat("猫儿", "公", "玩游戏");
master.play(cat);
}
}
// 旺财正在接飞盘...
// 猫儿正在走猫步...
总结
多态的条件:
- 继承(继承是多态的基础,没有继承就没有多态)
- 重写(多态下调用的是子类重写后的方法)
- 父类引用变量指向子类对象:
Parent p = new Child();
将父类作为方法的形参(将Pet作为play方法的形参),将子类的对象作为方法的实参(将dog、cat作为play的实参),从而实现多态。
多态的优点:
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性