这个问题真是个头疼的问题,怎么说的都有
观点一:多态的三要素,1,2,3 所以重载不是多态
观点二:
java虚拟机一书中提到
多态性特征的一些最基本的体现,如“重载”和“重写” 8.1节这话的意思是重载和重写都是多态的体现
各位怎么理解
每本书翻译得不一样,最好指明英文术语,是Override还是Overload。
Override是多态的体现(例如@Override public String toString() {...}),但@Override public String toString() {...}),但Overload不是(例如PrintStream.println()和PrintStream.println(String s)Overload
@Override public String toString() {...}
PrintStream.println()
PrintStream.println(String s)
实际上,中文“重载”对应的英文有三个:override, overload 和 overwrite,后来渐渐把最后一个改译为“重写”或者“改写”。
override,是指对父类同签名的函数进行重新定义的一种做法,这种情况下,父类函数和子类函数都分别独立的个体。但在调用的时候,编译器(或解释器)能根据对象的实际类型来判断调用哪一个实现。
overload 是指对同一个函数名,不能签名的多种实现。这种情况下,往往可以使同一个函数名对不同类型的参数进行调用而产生不同的结果,典型的例子就是 max(int, int) 和 max(double, double) 等。
max(int, int)
max(double, double)
overwrite 通常是子类对父类同签名函数的改写,两个函数签名一样,但是毫无关系。这种情况下父类类型对子类对象的引用,调用方法是是调用的父类方法(注意与 override 的不同)
关于 overwrite 和 override 的不同,如下图
现在来说多态。我们先看看多态的定义:
多态指同一个实体同时具有多种形式。(必应网曲)
多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。(百度百科)
从定义来看,“重载”与多态无关,但是重载是多态的一种体现形式,其它的还包括接口、抽象、虚函数、模板、泛形…………,再从百度百科引用几句话:
简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数实现的。 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。 C++中,实现多态有以下方法:虚函数,抽象类,覆盖,模板(重载和多态无关)。 多态就是允许方法重名 参数或返回值可以是父类型传入或返回。
简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数实现的。
多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
C++中,实现多态有以下方法:虚函数,抽象类,覆盖,模板(重载和多态无关)。
多态就是允许方法重名 参数或返回值可以是父类型传入或返回。
可能存在翻译错误,多态是指对象在不同上下文环境表现出不同的特性,比如一个子类Child继承了父类parent,parent中有一个login方法,Child类中也新增加了一个方法,save。也直接使用Child child1=new Child(),child1对象可以调用save和login方法,使用Parent child2 = new Child(),child2对象只能使用login方法。所以根据上下文而定。
每本书翻译得不一样,最好指明英文术语,是Override还是Overload。
Override是多态的体现(例如
不是(例如@Override public String toString() {...}
),但@Override public String toString() {...}
),但Overload不是(例如PrintStream.println()
和PrintStream.println(String s)
OverloadPrintStream.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方法。所以根据上下文而定。