在程序运行时,相同类型的变量可以呈现出不同的行为特征,这就是多态。多态的作用在于,它可以提高程序的扩展性。
(前父后子),父类型的引用指向子类型的对象
多态除了代码的复用,还可以解耦。然而为什么要解耦?耦合度讲的是模块模块之间,代码代码之间的关联度,通过对系统的分析把他分解成一个一个子模块,子模块提供稳定的接口,达到降低系统耦合度的的目的,模块模块之间尽量使用模块接口访问,而不是随意引用其他模块的成员变量。
对象的多态(核心,重点,也是最困难的一部分):
(1)一个对象的编译类型和运行类型可以不一致
(2)编译类型在定义对象时就确定了,不能改变
(3)运行类型是可以变化的
(4)编译类型看定义时 = 号的左边,运行类型看 = 号的右边
多态有什么好处?
有两个好处:
- 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。//继承
- 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。 //多态的真正作用,
多态在什么地方用?
可以用在方法的参数中和方法的返回类型中。.
(1)编译时多态(设计时多态):方法重载。
(2)运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态。(我们平时说得多的事运行时多态,所以多态主要也是指运行时多态)
运行时多态存在的三个必要条件:
(1)要有继承(包括接口的实现);
(2)要有重写;
(3)父类引用指向子类对象。
java多态的好处:
(1)可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
(2)可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
(3)接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
(4)灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
(5)简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
注意:优先级从高到低:this.show(O)、super.show(O)、
this.show((super)O)、super.show((super)O)。
Map<String,String> map1 = new HashMap<String,String>();
Map<String,String> map2 = new TreeMap<String,String>(); 统一类型 ,多种形态
Map为接口, 相当于对外访问点, 不同实现, HashMap ,TreeMap ,相当于不同形态
多态,可以理解为一致类型,不同形态,
好处在于统一对外的访问点, 却可以自定义形态功能 ,灵活`