# java 中方法重载和覆盖之间的区别

> 原文： [https://beginnersbook.com/2014/01/difference-between-method-overloading-and-overriding-in-java/](https://beginnersbook.com/2014/01/difference-between-method-overloading-and-overriding-in-java/)

在本教程中，我们将讨论 Java 中的重载和重写之间的区别。如果您不熟悉这些条款，请参阅以下帖子：

1.  [java 中的方法重载](https://beginnersbook.com/2013/05/method-overloading/)
2.  [方法覆盖 java](https://beginnersbook.com/2014/01/method-overriding-in-java-with-example/)

## 在 Java 中重载与覆盖

1.  重载发生在[编译时](https://beginnersbook.com/2013/04/runtime-compile-time-polymorphism/)，而重载发生在[运行时](https://beginnersbook.com/2013/04/runtime-compile-time-polymorphism/)：重载方法调用与其定义的绑定发生在编译时，但重写的方法调用绑定到其定义发生在运行。
2.  静态方法可以重载，这意味着一个类可以有多个同名的静态方法。即使在子类中声明相同的静态方法，它与父类的相同方法无关，也无法重写静态方法。
3.  最基本的区别是重载是在同一个类中完成的，而重写基类和子类是必需的。重写是关于为父类的继承方法提供特定实现。
4.  [静态绑定](https://beginnersbook.com/2013/04/java-static-dynamic-binding/)用于重载方法，[动态绑定](https://beginnersbook.com/2013/04/java-static-dynamic-binding/)用于重写/重写方法。
5.  性能：与重写相比，重载提供了更好的性能。原因是重写方法的绑定正在运行时完成。
6.  private 和 final 方法可以重载但不能覆盖它们。这意味着一个类可以有多个具有相同名称的私有/最终方法，但子类不能覆盖其基类的私有/最终方法。
7.  返回类型的方法在方法重载的情况下无关紧要，可以相同或不同。但是，在方法覆盖的情况下，覆盖方法可以具有更具体的返回类型（[参考此](https://stackoverflow.com/questions/14694852/can-overridden-methods-differ-in-return-type)）。
8.  在进行方法重载时，参数列表应该不同。方法 Overriding 中的参数列表应该相同。

### 重载示例

```java
//A class for adding upto 5 numbers
class Sum
{
    int add(int n1, int n2) 
    {
        return n1+n2;
    }
    int add(int n1, int n2, int n3) 
    {
        return n1+n2+n3;
    }
    int add(int n1, int n2, int n3, int n4) 
    {
        return n1+n2+n3+n4;
    }
    int add(int n1, int n2, int n3, int n4, int n5) 
    {
        return n1+n2+n3+n4+n5;
    }
    public static void main(String args[])
    {
    	Sum obj = new Sum();
    	System.out.println("Sum of two numbers: "+obj.add(20, 21));
    	System.out.println("Sum of three numbers: "+obj.add(20, 21, 22));
    	System.out.println("Sum of four numbers: "+obj.add(20, 21, 22, 23));
    	System.out.println("Sum of five numbers: "+obj.add(20, 21, 22, 23, 24));
    }
}
```

输出：

```java
Sum of two numbers: 41
Sum of three numbers: 63
Sum of four numbers: 86
Sum of five numbers: 110
```

这里我们有 4 个版本的相同方法`add`。我们在这里重载方法`add()`。

### 覆盖示例

```java
package beginnersbook.com;
class CarClass
{
    public int speedLimit() 
    {
        return 100;
    }
}
class Ford extends CarClass
{
    public int speedLimit()
    {
        return 150;
    }
    public static void main(String args[])
    {
    	CarClass obj = new Ford();
    	int num= obj.speedLimit();
    	System.out.println("Speed Limit is: "+num);
    }
}
```

Output:

```java
Speed Limit is: 150
```

这里`Ford`类的`speedLimit()`方法覆盖了类`CarClass`的`speedLimit()`方法。