目标:
清楚多态的含义及运用
内容:
当我们不确定一个引用变量到底会指向哪个类的实例对象、此变量发出的方法调用是否为我们指定的某个类中的方法。如果将变量绑定到各种不同的类实现上,可以使得让程序自己选择运行状态,即为多态。
简单来说,比如我想吃水果,那么不管我是吃葡萄,还是吃西瓜,都是吃水果。
特点:
- 多态的前提:是继承、并且要有方法的重写
- 父类引用指向子类对象,如:Animal a = new Cat();
实例:
假如我们需要写一个模拟养宠物的功能
//宠物类
public abstract class Pet {
private String name;//名字
private int health; //健康值
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
//吃东西的方法
public abstract void eat();
}
//小猫类
public class Cat extends Pet{
//重写父类吃东西的方法
public void eat(){
//健康值加10
this.setHealth(this.getHealth()+10);
System.out.println("鱼很好吃,健康值+10");
}
}
//小狗类
public class Dog extends Pet {
//重写父类的吃东西的方法
public void eat(){
//健康值加15
this.setHealth(this.getHealth()+15);
System.out.println("汪汪汪~骨头不错哦,健康值+15");
}
}
//主人类
public class Lady {
private String name;//名字
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//构造方法
public Lady(String name) {
this.name = name;
}
//养猫的方法
public void feedCat(Cat cat){
cat.eat();
}
//养狗的方法
public void feedDog(Dog dog){
dog.eat();
}
}
当我们使用继承写完Pet类之后会发现,主人类中feedCat方法和feedDog方法似乎是一样的,这时候就体现出多态的优化性,下面使用多态进行优化
//主人类
public class Lady {
private String name;//名字
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//构造方法
public Lady(String name) {
this.name = name;
}
//养宠物的方法
//以父类作为方法的参数,实现多态
public void feed(Pet pet){
pet.eat();
}
}
//测试类
public class Test {
public static void main(String[] args) {
//创建一个小主人
Lady l1 = new Lady("lily");
//创建两个宠物,属于小主人的宠物
Dog d = new Dog();
d.setName("大黄");
d.setHealth(60);
Cat c = new Cat();
c.setName("蓝猫");
c.setHealth(50);
//小主人喂养小狗
l1.feed(d);
//小主人喂养小猫
l1.feed(c);
}
}
可以看出,如果有后续添加宠物类型的话,只需要编写继承即可,主人类只需要使用feed()方法可以直接让程序自己寻找到对应的宠物类型。
总结:
1、多态增加了可维护性,使得在不改变原有代码的基础上可以新增子类,拓展功能;
2、多态能够动态确认对象的类型,提高了代码的灵活性;
3、多态可以实现代码重用,将相似功能写在一起,让子类能够复用,大幅度减少了代码的重复性。