方法重载和方法覆盖有何区别?

50

什么是方法重载和方法覆盖之间的区别?能否用例子来解释一下?

2个回答

142

方法重载指的是在同一个类中有两个或更多方法拥有相同的名称但参数不同。

void foo(int a)
void foo(int a, float b)

方法覆盖指的是具有相同参数但实现不同的两个方法。其中一个存在于父类中,而另一个存在于派生或子类中。@Override注释虽然不是必需的,但可以在编译时有助于强制执行方法的正确覆盖

class Parent {
    void foo(double d) {
        // do something
    }
}

class Child extends Parent {

    @Override
    void foo(double d){
        // this method is overridden.  
    }
}

30
@Override 不是必需的。这是一个好的惯例,但不是强制性要求。 - GriffeyDog
7
抱歉 @GriffeyDog。你是正确的,“@Override”不是强制性的,但记住你正在重写一个方法是一个好习惯。谢谢提醒。 - Hisham Muneer
5
重载不一定在同一个类中进行,也可以在父类和派生类之间完成。 - happs
1
回复@happs的评论:如果父类定义了一个签名,派生类定义了第二个签名,则仍然会发生重载,参见JLS§8.4.9:“如果一个类的两个方法(无论是在同一类中声明的还是由类继承的或者一个声明和一个继承)具有相同的名称但不是覆盖等效的签名,则该方法名称被称为重载。” - T.J. Crowder

35

方法重写指的是一个子类重新定义了一个与父类相同参数的方法。例如,标准的Java类java.util.LinkedHashSet继承自java.util.HashSet,并在其中重写了add()方法。如果您有一个类型为HashSet的变量,并调用它的add()方法,它将根据是HashSet还是LinkedHashSet选择适当的实现来调用add()方法。这被称为多态。

方法重载是在同一个类中定义多个方法,接受不同数量和类型的参数。在这种情况下,实际调用的方法是在编译时根据参数的数量和类型来确定的。例如,方法System.out.println()是被重载的,因此您可以传递整数和字符串,它将调用不同版本的方法。


4
如果您有一个子类定义了与不同参数的相同方法,那么这被认为是既覆盖又重载吗? - barlop
4
那么它只是过载,因为它没有覆盖任何父方法。 - Vincent Zou
此外,下一个问题是执行哪种方法?总结如下:在重载中,我们遵循引用类型进行执行,在覆盖中,我们遵循对象类型进行执行。 - Naim R.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接