黑马程序员技术交流社区
标题:
overload(重载)与多态
[打印本页]
作者:
鲁中需
时间:
2012-10-26 10:51
标题:
overload(重载)与多态
昨天在论坛中碰到一个问题“Overload和Override是多态性的表现?这怎么理解.... ”,之前开过一学期的C++课程,里面说的很清楚,重载是多态的一种形式,我就按C++中的理论给他回答了,后来有人说没有继承就没有覆盖,我就翻java编程思想,看看相关章节怎么说的,讲多态是没提到重载,说重载是也没提到多态,好像二者之间没什么关系,疑惑,求解。
作者:
程杰
时间:
2012-10-26 11:33
我觉的重载和多态没什么关系吧,重载只是一个类中方法名一样,后面参数不同。而重写是子类继承父类,子类的方法名,参数个数类型都和父类一样。而多态是父类的引用指向子类对象。我理解父类的引用指向子类对象,他可以调用子类的方法。而子类的方法又是重写父类的方法,就是这种联系吧
作者:
鲁中需
时间:
2012-10-26 12:00
程杰 发表于 2012-10-26 11:33
我觉的重载和多态没什么关系吧,重载只是一个类中方法名一样,后面参数不同。而重写是子类继承父类,子类的 ...
嗯,在java中应该不把它归为多态的一种吧,但在C++中它的确是多态的一种形式。后来我在百度百科上看到关于重载有两种说法。重载(百度百科)
第一种说法
重载是一种多态(如C++),有四种形式的多态:
1.虚函数多态
2模板多态
3重载
4转换
所谓的动态和静态区分是另一种基于绑定时间的多态分类,严格来说,重载是编译时多态,即静态多态,根据不同类型函数编译时会产生不同的名字如int_foo和char_foo等等,以此来区别调用。故重载仍符合多态定义——通过单一标识支持不同特定行为的能力,只是重载属于静态多态,而不是通过继承和虚函数实现的动态多态。
第二种说法
重载(overload)和多态无关,真正和多态相关的是覆盖(override)。
当派生类重新定义了基类的虚拟方法后,基类根据赋给它的不同的派生类引用,动态地调用属于派生类的对应方法,这样的方法调用在编译期间是无法确定的。因此,这样的方法地址是在运行期绑定的(动态绑定)。
重载只是一种语言特性,是一种语法规则,与多态无关,与面向对象也无关。
不过针对所谓的第二种重载,有一个专门的名词--重写或重定义。重载与重写的区别就在于是否覆盖,重写一般多发生在不同的类且存在继承关系之间,而重载多是在一个类里或者一块代码段里。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2