什么是多态
多态是对方法而言,同一种方法,但其实现的功能却不同(执行结果不同)
- 多态的作用是清除类型间的耦合关系
- 对同一种方法,传入参数类型不同,运行结果不同
- 多态的实现依靠继承(向上转型)的特性
- 多态又称动态绑定,后期绑定,运行时绑定
方法调用绑定
将一个方法调用同方法对象关联起来,根据关联时间,可分为两种:
动态绑定
:程序运行时,根据对象类型进行绑定
—-重点
‘静态绑定’:在程序执行前绑定
静态绑定的特点是:在程序运行前,就进行绑定
动态绑定特点是:编译器一直不知道对象类型,但是方法调用机制,能根据对象类型找到正确的方法体,即最终要调用哪种方法要看对象类型
向上转型
+动态绑定
==多态
一个多态的例子
1 | package package1; |
运行结果
1 | Circle`s draw |
多态的应用
利用多态机制,可以隐藏接口的实现–由于向上转型,所以无法确定是有哪种子类向上转型而来。
其次:可以将改变的事物与不变的事物分离开来,降低程序的耦合性,即,可以在不改变接口调用方法的情况下,修改接口的实现,而接口使用者无需了解接口如何实现,
域、静态与多态
域(
field
):A field is an attribute. A field may be a class’s variable, an object’s variable, an object’s method’s variable, or a parameter of a function.详细解析
域,静态方法是不具有多态性的。只有普通方法具有多态性
下面的例子是重点,需要重点理解!
接口类的多态性
1 | package Chapter9; |
运行结果1
2
3
4
5
6
7
8
9
10
11Circle`s draw
Circle`s erase
Cirle`s getField(): i am Circle`s field
获得接口中的域(getSupField) :i am Shape`s field
Circle.field= i am Shape`s field
Square`s draw
Square`s erase
Squsre`s getField(): i am Square`s field
Square.field= i am Shape`s field
demo`s getField(): i am Demo1`s field
Demo1.field= i am Shape`s field
分析
1 | Shape cirle = new Circle(); //向上转型 |
Circle类实现Shape接口,Circle和Shape都有field这个域
(变量),
当Circle向上转型成Shape时,获得field会出现何种情况?
- 如果以调用接口类普通方法的形式,由于普通方法具有多态性,因此,
field
取决于对象中域
内部field
的值 - 如果不以方法形式获取,则就没有多态性,取决于引用的类型
继承形式的多态性
1 | package Chapter9; |
运行结果1
2
3
4
5
6
7Cirle`s getField(): i am Circle`s field
获得基类中的域(getSupField) :i am Shape`s field
Circle.field= i am Shape`s field
Squsre`s getField(): i am Square`s field
Square.field= i am Shape`s field
demo`s getField(): i am Demo1`s field
Demo1.field= i am Shape`s field