0%
javaSE复习之——面向对象_抽象类
javaSE复习之——面向对象_多态
多态前提
- a : 要有继承关系。
- b : 要有方法重写。
- c : 要有父类引用指向子类对象。
例有一个父类
fu
和一个子类zi
,那么父类引用子类对象为:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25fu a = new zi(); ```
<!--more-->
# 成员变量
- 编译、运行看左边(父类)
也就是创建对象后,`子类引用对象就优先调用子类(这样就不是多态了,因为它没有父类引用子类对象)`,`父类引用对象就优先调用父类(编译运行看左边)`
- 解析:创建对象时,首先在堆中创建子类的对象(this),而这个子类的对象中有一个区域指向super,如果引用这个对象的是`父类`那么这个引用指向`super`区域,否则指向`this`区域
# 成员方法
- 编译看左边(父类)、运行看右边(子类)。`动态绑定`
ps:父类中一定要有和子类一样的方法,父类中的那个方法可以理解为一个跳板跳转到子类中的方法中。
# 静态成员方法
- 与成员变量同理,`编译、运行看左边(父类)`,所以`多态中静态方法不存在重写`
# 多态的弊端
- 父类引用不能使用子类`特有的属性和行为`,但是能通过zi b = (zi)a; //强转类型```
多态的好处
1、提高了代码的
维护性
(继承保证)2、提高了代码的
扩展性
(由多态保证)
多态的使用
1、开发是很少在创建对象的时候使用多态,而是直接创建
子类引用子类对象
2、在需要使用方法使代码简洁时,
当做参数
使用多态效果最好,因为扩展性强
比如:现有三个类“
动物
”“狗
”“猫
”动物是父类,当我们有很多只狗和猫需要跑时,就可以使用方法函数
来使代码简洁,在调用这个方法时可以创建好一个 狗 或 猫 的对象然后传给参数
,这就需要使用到多态了,如果不使多态
那么就需要给狗和猫分别创建一个函数。
不过
在方法中使用多态
还有一个问题:狗 和 猫 都有各自特有的功能与属性
,如果调用猫的功能,但是传入的对象是狗,那么就出错了。解决方法:关键字 instanceof
ps:了解一下,开发中用到的不多,一般都用到
方法重写
- 代码实例:
1 | 对象变量A instanceof 对象变量B |
多态中的代码分析
1 | class A { |
- 得出结果:
在多态中,父类中的方法调用另一个方法,且
被调用的方法
都存在于子类与父类中的情况下,优先调用子类的方法,也就是父类方法
成为了一个跳板,跳转到了子类的方法中 - 还是那句话:
成员
方法
编译看左边(父类)、运行看右边(子类)成员
变量
编译看左边(父类)、运行看左边(父类)