java面向对象-多态
什么是多态?
-
多种形态,多种状态,编译和运行有两个不同的状态
-
编译期叫做静态绑定,运行期叫做动态绑定
-
Animal a = new Cat();
a.move();
编译的时候编译器发现a的类型是Animal,所以编译器会去Animal类中找move方法,找到了,绑定,编译通过。
但是运行的时候和底层堆内存当中的实际对象有关,真正执行的时候会自动调用“堆内存中真实对象(cat)”的相关方法。 -
多态的典型代码:父类型的引用指向子类型的对象
-
即同一方法可以根据发送对象的不同而采用多种不同的行为方式
-
一个对象的实际类型是确定的,但可以指向的对象的引用的类型有很多
注意点
- 父类没有独有的方法,因为父类所有的方法都会被继承了
- 多态是方法的多态,属性没有多态
- 存在条件: 继承关系,方法需要重写,父类引用指向子类对象
多态在开发中的作用
我们通过一个小案例来来理解多态在开发中的作用!
首先,我们先不用pet这个父类,用普通编程思想来实现这个小案例,我们先编写一个主人类,主人类中有feed方法,然后再编写Dog、Cat宠物类,它们都有一个eat方法,然后再编写测试类实现主人喂宠物
注:这并不是宠物类子类!!!
通过上图,我们可以看出每当主人需要喂养新的宠物时,那么主人类中就必须新增一个方法,不然主人喂养不到新的宠物,就比如主人现在需要喂养新的宠物鹦鹉,我们需要编写一个鹦鹉类,那么主人类中就必须要新增一个新的feed方法,从而实现喂养鹦鹉!!!
我们可以将喂养新宠物鹦鹉代表客户产生了新的需求,作为开发人员,我们必须满足客户的需求!
我们在不使用多态机制的前提下,目前我们只能在Master类中添加新的方法。
思考:修改Master类这个类有什么问题?
从这里我们看出,主人类与宠物们之间的联系程度特别高(高耦合),每当主人喂养新的宠物时,主人类中的代码就必须修改!这样的设计思想是不符合我们的开发原则(ocp)的!!!
什么是ocp(开闭原则)?
就是软件在扩展过程当中时,代码修改量越少越好,修改的越多,你的系统当前的稳定性就越差,未知的风险就越多!
这时,我们就需要使用多态机制,主人的feed方法中的形参不应该写死,不要写具体的对象,应该写一个更加抽象的类型,所以我们就需要写一个父类(pet),父类中也有一个eat方法,宠物们去继承这个父类,重写eat方法
这样每当需要喂养新的宠物时,主人类就不需要修改
如图看出,主人类只有一个方法,但是宠物们都可以喂养到,每当zhangsan需要喂养哪个宠物时,只需要把实例对象丢到这个feed方法中就好了。
如zhangsan.feed(cat); 它运行时父类方法是这样的
//这里有个自动转换:Pet pet = Cat cat; 也就等于Pet pet = new Cat();
public void feed( Pet pet = new Cat() ){
pet.eat();
}
Pet pet = new Cat():父类型的引用指向子类型的对象
编译的时候编译器发现pet的类型是Pet,所以编译器会去Petl类中找eat方法,找到了,绑定,编译通过。
但是运行的时候和底层堆内存当中的实际对象有关,真正执行的时候会自动调用“堆内存中真实对象(cat)”的相关方法,也就是Cat类中的eat方法!!