1、面向对象的三大特征
封装、继承、多态。
2、多态的定义
指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
3、多态的作用
消除类型之间的耦合关系
4、多态存在的三个必要条件
1)要有继承
2)要有重写
3)父类引用指向子类对象
Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载。
4)多态的好处
可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性、以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类如Circle和Sphere为了实现多态,完善或者覆盖着两个接口方法。
灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
代码实战:
举例:
对象的多态性: 动物 x = new 猫();
函数的多态性: 函数重载、重写
(1)多态的体现
父类的引用指向了自己的子类对象
父类的引用也可以接收自己的对象
(2)多态的前提
必须是类与类之间只有关系,要么继承或实现
通常还有一个前提,存在覆盖
(3)多态的好处
多态的出现大大提高了程序的扩展性
(4)多态的弊端
只能使用父类的引用访问父类的成员
父类:
package com.kangning.web.controller.test.bochy;
public abstract class Animal {
abstract void eat();
}
Cat:
package com.kangning.web.controller.test.bochy;
public class Cat extends Animal{
public void eat(){
System.out.println("吃鱼");
}
public void catchMouse(){
System.out.println("抓老鼠");
}
}
Dog:
package com.kangning.web.controller.test.bochy;
public class Dog extends Animal{
@Override
void eat() {
System.out.println("吃骨头");
}
public void kanJia(){
System.out.println("看家");
}
}
package com.kangning.web.controller.test.bochy;
public class DuoTaiDemo {
public static void main(String[] args) {
function(new Cat());
function(new Dog());
Animal a = new Cat();
a.eat();
Cat c = (Cat) a;//向下转型
c.catchMouse();
}
public static void function(Animal a) {
a.eat();
/**
* 用于子类型或判断所属类型进而使用其特有方法
*/
if (a instanceof Cat) {
Cat c = (Cat) a;
c.catchMouse();
} else if (a instanceof Dog) {
Dog c = (Dog) a;
c.kanJia();
}
}
}
运行结果如下: