关于 overloading 和 overriding
首先 java 中所有的方法都采用后绑定,就是在运行时绑定(除了被声明为 final 和 static 的)
java通过方法的 signature 来判断一个方法与其他方法的关系,是无关的,overload 或 override
方法的 signature 可以肯定的是方法名和参数。返回值,权限修饰词(public private),final,
static 修饰词的情况有点复杂后面依次讨论。
final && private
被声明为 final 或 private 的方法都是不能被 override 的,一定要注意这是两个语义完全不同的词,
他们除此以外没有任何联系。final 不仅不允许子类 override,并且禁止子类使用名字和参数相同但返回
值不同的方法 overload(如例子中的 functionEight()),而 private 不同,他对子类是不可见的
你完全可以在子类中定义一个与父类一摸一样的方法(这完全合理)。因此说 private 隐含有 final 的
意思并不准确。 private 就是说 It's mine~~~~~~~~~ 对于类以外,没有人知道它的存在。final
只是说这个方法不想被你覆写。
返回值
返回值不是方法的 signature,当方法名和参数相同时编译器会强制要求返回值必须一致,但子类 override
父类的方法返回值可以不同,同样有一个条件返回值类型之间要有继承关系!!(例子中的
functionTwo() functionThree() functionFour() 很好的演示这种关系)。要 override,
子类的返回值类型必须是父类的返回值类型的子类(有点拗口,看看 fanctionTwo() functionFour
就会明白了),这也应该是我们想要的行为。
public && private && protected
继承时方法的权限可以扩大但不能缩小(public > protected > none > private)(例子
functionSix() and functionSeven())
static
你可以覆写 static 方法,就像 functionFive() 一样,看起来是 override,但实际上 static
方法始终是前绑定,即在编译时绑定的。所有永远不会产生多态的效果,我们还是打消 override
static 方法的念头吧
posted on 2005-08-24 01:17
JBahamut 阅读(164)
评论(0) 编辑 收藏