到底什么是多态?
面向对象三大特征:封装、继承、多态
前面两个应该比较好理解,顾名思义,那最后这个多态到底是什么?
我最近也看了一些相关的文章,但是可能因为水平尚浅,不是很能理解
所以想自己总结一下,不一定完全正确,欢迎大家提出意见
我认为多态这两个字,可以解释为 多个形态
多态其实是建立在封装与继承的基础之上的,尤其是继承
我们首先创建一个动物类,因为动物需要吃饭,喝水
所以我们就为它定义这两个属性
public class Animal{
// 吃东西
private String eat;
// 喝东西
private String drink;
}
然后我们再定义一个具体的动物老虎,让它去继承这个动物类,老虎里面什么属性都没有定义
public class Tiger extends Animal{
}
然后我们再定义一个狮子对象,也让它去继承动物
public class Lion extends Animal{
}
然后我们定义一个方法,参数传Animal对象,同时创建狮子与老虎的具体对象去调用它
private void testAnimal(Animal animal) {
animal.setEat("狗粮");
animal.setDrink("矿泉水");
}
public void test() {
Tiger tiger = new Tiger();
testAnimal(tiger);
Lion lion = new Lion();
testAnimal(lion);
}
通过这个例子可以看到,假如我们把testAnimal这个方法抽象为接口,我们的参数只需要定义一个Animal父类就可以,不需要去关心对方到底想传什么动物
即使再新建黑熊、河马等等,这些动物都需要去吃东西,喝东西,但我们不可能为每个动物都写个方法,那样代码会变得极为重复并且不利于维护
然后可能有同学会有疑问,那要是不同的动物需要吃不同的东西怎么办,你这都写成固定的数据了,这个更简单了,还是两个字,抽象,再把狗粮与矿泉水抽象为参数就可以了
public void test() {
Tiger tiger = new Tiger();
testAnimal(tiger,"面包","牛奶");
Lion lion = new Lion();
testAnimal(lion,"香肠","可乐");
}
private void testAnimal(Animal animal, String food, String water) {
animal.setEat(food);
animal.setDrink(water);
}
上面只是一个简单的例子,多态还需要在代码中不断地去理解,去总结,掌握并非一朝一夕
多态的最大作用就是 让大家实现了 “面向抽象编程,面向接口编程”
有了多态,我们能把具体的老虎、狮子的接口抽象为动物
多态就好像一只无形的手将基类(Anmial)还有子类(Tiger,Lion)联系起来,如果没有多态,那么很多继承可能就失去了作用,抽象也成为了空谈
总而言之,封装和继承是多态的基石,有了多态才能进行真正的面向对象编程,面向接口编程