Dieses Problem bereitet wirklich Kopfschmerzen, egal wie man es sagt
Ansicht 1: Die drei Elemente des Polymorphismus, 1, 2, 3
Überladung ist also kein Polymorphismus
Ansicht 2:
Erwähnt im Buch Java Virtual Machine
Einige der grundlegendsten Manifestationen von Polymorphismusmerkmalen, wie „Überladung“ und „Umschreiben“ Abschnitt 8.1
Das bedeutet, dass Überladung und Umschreiben beide Manifestationen von Polymorphismus sind
Wie verstehst du?
每本书翻译得不一样,最好指明英文术语,是Override还是Overload。
Override是多态的体现(例如
@Override public String toString() {...}
),但Overload不是(例如PrintStream.println()
和PrintStream.println(String s)
)。实际上,中文“重载”对应的英文有三个:override, overload 和 overwrite,后来渐渐把最后一个改译为“重写”或者“改写”。
override,是指对父类同签名的函数进行重新定义的一种做法,这种情况下,父类函数和子类函数都分别独立的个体。但在调用的时候,编译器(或解释器)能根据对象的实际类型来判断调用哪一个实现。
overload 是指对同一个函数名,不能签名的多种实现。这种情况下,往往可以使同一个函数名对不同类型的参数进行调用而产生不同的结果,典型的例子就是
max(int, int)
和max(double, double)
等。overwrite 通常是子类对父类同签名函数的改写,两个函数签名一样,但是毫无关系。这种情况下父类类型对子类对象的引用,调用方法是是调用的父类方法(注意与 override 的不同)
关于 overwrite 和 override 的不同,如下图
现在来说多态。我们先看看多态的定义:
多态指同一个实体同时具有多种形式。(必应网曲)
多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。(百度百科)
从定义来看,“重载”与多态无关,但是重载是多态的一种体现形式,其它的还包括接口、抽象、虚函数、模板、泛形…………,再从百度百科引用几句话:
可能存在翻译错误,多态是指对象在不同上下文环境表现出不同的特性,比如一个子类Child继承了父类parent,parent中有一个login方法,Child类中也新增加了一个方法,save。也直接使用Child child1=new Child(),child1对象可以调用save和login方法,使用Parent child2 = new Child(),child2对象只能使用login方法。所以根据上下文而定。