Java 重载与重写

2022-09-02 23:36:42

嗨,我只是想确保我有这些概念是正确的。Java中的重载意味着您可以拥有具有不同参数数或不同数据类型的构造函数或方法。即

public void setValue(){
   this.value = 0;
}
public void setValue(int v){
   this.value = v;
}

这种方法怎么样?由于它返回不同的数据类型,它是否仍被视为重载?

public int setValue(){
   return this.value;
}

第二个问题是:Java中覆盖的内容是什么?它与继承有关吗?让我有以下几点:

public class Vehicle{
  double basePrice = 20000;
  //constructor defined
  public double getPrice(){
     return basePrice;
   }
}

public class Truck extends Vehicle{
  double truckPrice = 14000;
  //constructor defined
  public double getPrice(){
     return truckPrice;
   }
}

所以现在让我们假设我有以下

Truck truck = new Truck();

如果我打电话给

truck.super.getPrice()

这将返回车辆类的价格,20,000

如果我打电话给

truck.getPrice()

这将返回卡车类的价格,14,000

对于这两个问题,我的知识是否正确?


答案 1

你基本上是正确的。重载是在单个类中具有多个方法,其中方法具有相同的名称。但是,返回值不被视为方法签名的一部分。因此,不能通过仅更改返回值来重载方法。您的示例中不能有以下代码:

public void setValue() {
   this.value = 0;
}

public int setValue() {
   return this.value;
}

这将无法编译。

正如Rob所指出的,我相信你的意思是压倒一切,你是对的。请注意,使用重写时,您无法更改返回类型。从 Java 5 开始,您可以返回基类方法返回的派生类型。在 Java 5 之前,它必须是相同的类型。也就是说,在 Java 5 及更高版本之前,您无法执行以下操作:

public class AnimalNoise {}
public class Miaw extends AnimalNoise {}

public class Animal {
    public AnimalNoise makeNoise() {
        return new AnimalNoise();
    }
}

public class Cat extends Animal {
    public Miaw makeNoise() {
        return new Miaw ();
    }
}

但是,即使在 Java 5 及更高版本中,也无法执行以下操作

public class Animal {
    public String makeNoise() {
        return "silence";
    }
}

public class Cat extends Animal {
    public Miaw makeNoise() {
        return new Miaw ();
    }
}
public class Miaw {}

最后,重载和重写之间经常被忽视的一大区别是,重载是在编译时决定的,而重写是在运行时决定的。这让许多人感到惊讶,因为他们期望在运行时决定重载。


答案 2

正确;重载是为同一方法提供多个签名。

覆盖,这就是我认为你所说的“覆盖”是指提供从基类型继承的方法的不同实现的行为,基本上是通过继承多态性的点,即

public class Bicycle implements Vehicle {
    public void drive() { ... }
}

public class Motorcycle extends Bicycle {
    public void drive() {
        // Do motorcycle-specific driving here, overriding Bicycle.drive()
        // (we can still call the base method if it's useful to us here)
    }
}