2012-05-13 37 views
6

我知道如何重载方法以及如何重写方法。但是,是否有可能超载并在同一时间重写一个方法?如果是,请举个例子。在Java中重载和覆盖

回答

13

重载和覆盖是互补的东西,重载意味着相同的方法名称,但参数不同,覆盖意味着具有相同参数的子类中的相同方法名称。因此,重载和覆盖不可能同时发生,因为重载意味着不同的参数。

例子:

class A { 
    public void doSth() { /// } 
} 

class B extends A { 
    public void doSth() { /* method overriden */ } 

    public void doSth(String b) { /* method overloaded */ } 

} 

干杯!

+5

如果您愿意,您可以覆盖重载的方法。它尽可能地接近它。 – user845279

+0

发生这种情况时,哪个负责该方法的绑定(静态或动态)呢?覆盖或重载? – zgulser

5

重载和重载只是抽象。重载仅意味着编译器使用该名称与参数的类型和数量相结合来寻址要调用的函数。实际上,重载方法与为它命名不同,因为编译器用来查找函数的关键字是名称和参数列表的组合。

覆盖是一种相同的原则,除了编译器可以用super关键字来解决覆盖函数。

那么你可以重写一个重载函数吗?是的,因为在编译器的眼中,重载方法是一种完全不同的方法。

+0

重写并不是一回事。关于调用哪个方法的决定推迟到运行时间。编译器不会决定它。 – EJP

+0

谢谢,这很有帮助! –

+0

@EJP - 编译器最终做出决定,即使它通过构建vtables和分配vpointers来简化动态分派而被抽象出来。绑定的关系必须在某处进行初始化。 – nsfyn55

1

这取决于你的意思。方法可以是超类中的重载方法的重写。你可以重载一个方法,你同时使用另一种方法重写。

但是,您不能有一种方法既是新的过载和覆盖。对于一个方法是一个覆盖,具有相同签名的另一个方法必须已经存在于超类中......并且这意味着此方法不能是覆盖的新方法。