学java的都知道java的三大特性:封装、继承、多态。
之前对多态了解的不是特别清楚,现在权当是写个列子加深印象,说明适当的时候使用多态可以达到的好处。
比如,现在在动物园,饲养员的话需要喂养很多动物,正常情况下的话,对饲养员来说需要一个一个去喂养,写成程序的方法如下:
public class Person { //饲养员喂猫 public void feed(Cat cat){ System.out.println("喂猫"); } //饲养员喂狗 public void feed(Dog dog){ System.out.println("喂狗"); } //饲养员喂养其他动物…… }
再把具体的动物形象出来
public class Cat { public void eat(){ System.out.println("猫吃饭"); } }
public class Dog { public void eat(){ System.out.println("狗吃饭"); } }
这种情况下,饲养员需要针对每种动物去专门喂养,写成程序如下
public class Feed { public static void main(String[] args) { Cat cat = new Cat(); Dog dog = new Dog(); Person person = new Person(); //饲养员喂猫 person.feed(cat); //饲养员喂狗 person.feed(dog); } }
如果动物很多,饲养员就会很累,需要不同动物的feed方法,程序就需要new 很多具体动物出来,写出来也比较繁琐,这时候就体现出多态的好处。
我们只需要在每个动物的食盆前面加上自动喂食的机器,饲养员只需要在房间里按下按钮,食物就自动倒在动物的食盆里,所以,饲养员就不需要专门到每个动物前面喂食了,所以我们只需要修改饲养员的喂养方法,让饲养员只有一个喂养动物的方法
public class Person { //饲养员喂食 public void feed(Animal animal){ System.out.println("喂" + animal.getName() + "吃饭"); } }
我们再把具体的动物写出来
public class Animal { private String name; public String getName() { return name; } public Animal setName(String name) { this.name = name; return this; } public void eat(Animal animal) { System.out.println(animal.getName() + "在吃饭"); } }
public class Cat extends Animal {
private String name;
public String getName() {
return name;
}
public Cat setName(String name) {
this.name = name;
return this;
}
public Cat(String name) {
this.name = name;
System.out.println(this.name + "食盆倒满");
}
}
public class Dog extends Animal {
private String name;
public String getName() {
return name;
}
public Dog setName(String name) {
this.name = name;
return this;
}
public Dog(String name) {
this.name = name;
System.out.println(this.getName() + "食盆倒满");
}
}
这样,饲养员喂养的时候,只需要调用喂养的方法就可以了,不需要知道专门的动物
public class Feed {
public static void main(String[] args) {
Person person = new Person();
Animal animal_1 = new Cat("猫");
//喂猫
person.feed(animal_1);
Animal animal_2 = new Dog("狗");
//喂狗
person.feed(animal_2);
}
}
这样写出来,饲养员就会省事省时省力很多。
我们可以把不同子类的对象都当做父类类型来对待,可以屏蔽不同子类对象之间的实现差异,从而写出通过的代码达到通用编程,以适应需求的不断变化。