💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 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. [javav 方法覆盖](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. 在进行方法重载时,参数列表应该不同。方法重载中的参数列表应该相同。 ### 重载示例 ```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); } } ``` 输出: ```java Speed Limit is: 150 ``` 这里`Ford`类的`speedLimit()`方法覆盖了类`CarClass`的`speedLimit()`方法。