多态是面向对象的特性之一,理解也不是特别困难,但是最近发现很多人喜欢把多态和覆盖(Overriding,暂且这么翻译吧)搅在一起。其实自己刚开始学的时候也曾经有过困惑,什么叫做重载(Overloading),什么叫做覆盖(Overriding),后来看书多了也就慢慢理解了,大体的总结一下:
    重载是方法之间的一种关系,多个方法使用相同的方法名,但是签名不同,所以我们可以通过签名来区分。早期的java中因为没有采用模板机制,所以大量的方法都是采用重载的方法写成的,比如最经典的System.out.println();在代码里有十种实现方法,接受各种不同类型的参数。这是Overloading。
    覆盖是类层次结构中的一种关系,比如父类有某个方法,子类中同样实现一个同名并且签名相同的方法,这种情况我们称之为overriding。注意,这里要求签名相同。但是返回值可以有些许不同,这里的不同指的是子类中重写的方法可以返回父类中返回类型的子类型,说起来很绕,简单的举个例子,如果父类中方法的返回类型是Number类型,那么子类中的这个覆盖方法的返回类型可以是Number类型,也可以是其子类型,比如Integer,Double等等。
    这样两个概念的区别已经很明了了,而且也应该知道,覆盖是实现多态的关键技术。
    两个概念还有个重要的区别是,重载是静态绑定的,因为编译的时候我就可以根据签名确定具体要调用的方法,而覆盖是运行时绑定的,因为运行的时候我才能根据运行时类型信息,确定具体要调用哪个类中定义的覆盖方法。
    最后,引经据典,配合一下自己的说法。
    《The Java Programming Language》中:
   
Overloading a method is what you have already learned: providing more than one method with the same name but with different signatures to distinguish them.
Overriding a method means replacing the superclass's implementation of a method with one of your own. The signatures must be identicalbut the return type can vary in a particular way, as discussed below.
 
本文来自CSDN博客,转载请标明出处: http://blog.csdn.net/ZangXT/archive/2008/07/19/2678981.aspx