淘先锋技术网

首页 1 2 3 4 5 6 7

Java语言中的重写和重载

重写(override)和重载(overload)是编程语言中的两个常见概念,用于描述函数或方法的特定行为。

重写指的是在子类中重新定义(覆盖)父类中已经存在的同名方法。重写可以修改或扩展父类的方法实现,使其更适合子类的需求。在重写中,子类方法的名称、参数类型、返回值类型必须与父类方法完全一致。

重载指的是在同一个类中定义多个同名的方法,但它们具有不同的参数类型和/或数量。在调用这些方法时,编译器会根据传入的参数类型和数量选择相应的方法进行调用。重载方法的返回值类型可以相同也可以不同。方法的名称必须相同,但参数列表必须有所不同。

一个重写方法的例子

假设有一个名为 "Vehicle" 的父类,其中包含一个名为 "move" 的方法。如果我们创建了一个名为 "Car" 的子类,并希望修改 "move" 方法的实现,以便更好地适应汽车的运动方式,那么我们可以使用重写在 "Car" 类中重新定义 "move" 方法。源码如下:

//重写示例
class Vehicle {
  public void move() {
    System.out.println("The vehicle is moving.");
  }
}

class Car extends Vehicle {
  @Override
  public void move() {
    System.out.println("The car is driving on the road.");
  }
}

public class TestOverride {
   public static void main(String args[]){
      Vehicle a = new Vehicle (); // Vehicle 对象
      Vehicle b = new Car(); // Car对象
 
      a.move();// 执行 Vehicle 类的方法
 
      b.move();//执行 Car 类的方法
   }
}

在这个例子中,Car 类重写了 Vehicle 类的 move() 方法,因此当我们调用 Car 的 move() 方法时,它将输出 "The car is driving on the road." 而不是原来的 "The vehicle is moving."。

特别提示,@Override注解不是必需的,但建议在重写父类方法时使用它。

@Override注解可以省略,但不建议这样做。如果我们在子类中重写了父类的方法,并且使用了@Override注解来标识这个方法,那么编译器会在编译时检查该方法是否正确地覆盖了父类中的同名方法。这可以帮助我们避免一些错误。如果我们省略了@Override注解,则编译器将无法检查出这些错误。

使用@Override注解还可以使代码更加易读和易维护。在阅读代码时,我们可以很容易地看到哪些方法是重写了父类中的方法。

一个重载方法的例子

源码如下:

//重载示例
class TestOverload{
  public int add(int a, int b) {
    return a + b;
  }
  
  public int add(int a, int b, int c) {
    return a + b + c;
  }
  
  public String add(String a, String b) {
    return a + b;
  }

  public static void main(String[] args){
    TestOverload o = new  TestOverload();
    int result1 = o.add(10,20); //执行int add(int a, int b)方法
    System.out.println(result1); //30
    int result2 = o.add(10,20,30); //执行int add(int a, int b, int c)方法       
    System.out.println(result2); //60
    String result3 = o.add("10", "20"); //执行String add(String a, String b)方法
    System.out.println(result3); //1020
  }
}

在这个例子中,我们在TestOverload类中定义了三个名为 "add" 的方法。一个接收int类型2个参数,一个接收int类型3个参数,还有一个接收String类型参数。当我们使用 TestOverload类的对象调用 add() 方法时,编译器会根据传入的参数类型和数量选择相应的方法进行调用。

在Java中,多态性是指同一个方法名称可以被不同的对象调用,且能够根据调用对象的实际类型来执行不同的方法。方法重载和方法重写是Java多态性的两种不同表现形式。

方法重载是指在同一个类中,可以有多个方法具有相同的名称,但参数列表必须不同或参数类型不同。重载方法可以有不同的返回类型,只要参数列表不同即可。

而方法重写是指子类实现了与父类相同的方法名称、参数类型和返回类型的方法。子类在重写方法时,可以改变方法的实现细节,但不能改变方法的名称、参数列表和返回类型。通过方法重写,子类可以覆盖掉父类的方法,并使用自己的实现逻辑。

方法重载和方法重写都是Java中多态性的不同表现,可以让程序更加灵活和易于扩展。

小结

重写(Override)是指子类使用与父类相同的方法名、返回类型和参数类型来覆盖父类中已有的方法实现。当我们需要修改父类中的方法实现时,就需要重写该方法。重写的方法不能比原来的方法具有更严格的访问权限,因为重写后的方法要能被父类类型的引用调用。重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。

重载(Overload)是指在同一个类中,有多个方法名称相同但参数列表不同的方法。它们的方法名相同,但参数类型、个数或顺序不同,即为重载。重载方法可以返回不同的值类型。

方法的重写和重载是Java多态性的不同表现,方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。