1、背景知识
-
Java是面向对象的语言,在Java中一切都是对象。Java具有OOP语言所具有的一切特性:封装、继承和多态。
-
多态是面向对象程序设计中一个非常重要的特性,理解了多态后能够很好地进行面向对象的分析与设计。
2、何为多态
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作。
如何理解?
多态性是对象多种表现形式的体现
例如现实中,比如我们按下 F1 键这个动作:
- 如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;
- 如果当前在 Word 下弹出的就是 Word 帮助;
- 在 Windows 下弹出的就是 Windows 帮助和支持。
同一个事件发生在不同的对象上会产生不同的结果。
再假设我们现在存在一个基类Animal,两个派生类dog和cat
如果对于任一我想要输入的动物名字,输出对应的动物图片,没有多态,我需要一个一个去判断
如果运用多态,则可以直接通过输入名字来找到相应的动物
3、多态存在的三个必要条件
-
继承
-
重写
-
基类引用指向派生类对象
比如
Parent p = new Child();
注:当使用多态方式调用方法时,首先检查基类中是否有该方法,如果没有,则编译错误;如果有,再去调用派生类的同名方法。
多态运用实例:
另外,运用多态还需要注意的点:
1. 多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量。
2. 多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数。
3. 多态情况下,子父类存在同名的静态的成员函数时,访问的是父类的成员函数。
4. 多态情况下,不能访问子类特有的成员。
总结:多态情况下,子父类存在同名的成员时,访问的都是父类成员,除了在同名非静态函数时才是访问子类的
4、多态的好处
- 1. 消除类型之间的耦合关系
- 2. 可替换性
- 3. 可扩充性
- 4. 接口性
- 5. 灵活性
- 6. 简化性
- 7.提高了代码的拓展性
5、多态中的重载和重写
一、重写(Overriding)的基本规则
-
参数必须要一样,且返回类型必须兼容
-
不能降低方法存取的极限
-
基类的成员方法只能被它的派生类重写。
-
声明为 final 的方法不能被重写。
-
声明为 static 的方法不能被重写,但是能够被再次声明。
-
构造方法不能被重写。
-
如果不能继承一个方法,那么它一定不能被重写
- 当需要在派生类中调用基类的被重写方法时,要使用 super 关键字。
二、重载(Overloading)的基本规则
-
返回类型可以不同
-
不能只改变返回类型
-
可以更改存储权限
-
方法能够在同一个类中或者在一个派生类中被重载。
三、两者的区别
区别点 | 重载方法 | 重写方法 |
---|---|---|
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可以修改 | 一定不能修改 |
异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |
一张形象的网图
6、知识总结
类型把对象分成组,并且管理着这些对象的接口。类型的继承层次结构决定了实现多态所需的类型关系。另外,实现的细节并不影响子类型多态的层次结构。类型决定了对象调用什么方法,而实 现则决定了对象怎么执行这个方法。也就是说,类型表明了责任,而负责实施的则是具体的实现。将实现和类型分离后,我们好像看到了这两个部分在一起跳舞,类型决定了他的舞伴和舞蹈的名字,而实现则是舞蹈动作的设计师。