Java重载vs重写

use*_*514 16 java overloading overwrite

嗨,我只是想确保我有正确的这些概念.在java中重载意味着您​​可以使用具有不同数量的参数或不同数据类型的构造函数或方法.即

public void setValue(){
   this.value = 0;
}
public void setValue(int v){
   this.value = v;
}
Run Code Online (Sandbox Code Playgroud)

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

public int setValue(){
   return this.value;
}
Run Code Online (Sandbox Code Playgroud)

第二个问题是:什么是重写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;
   }
}
Run Code Online (Sandbox Code Playgroud)

所以现在让我说我有以下内容

Truck truck = new Truck();
Run Code Online (Sandbox Code Playgroud)

如果我打电话

truck.super.getPrice()
Run Code Online (Sandbox Code Playgroud)

这将从Vehicle类返回20,000的价格

如果我打电话

truck.getPrice()
Run Code Online (Sandbox Code Playgroud)

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

我的知识对两个问题都是正确的吗?

Edd*_*die 32

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

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

public int setValue() {
   return this.value;
}
Run Code Online (Sandbox Code Playgroud)

这将无法编译.

正如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 ();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

public class Cat extends Animal {
    public Miaw makeNoise() {
        return new Miaw ();
    }
}
public class Miaw {}
Run Code Online (Sandbox Code Playgroud)

最后,经常忽略的重载和重写之间的重大区别是,在编译时决定重载,并在运行时决定重写.当他们期望在运行时决定重载时,这会让很多人感到意外.


Rob*_*Rob 6

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

覆盖,我认为你的意思是"覆盖"是提供从基类型继承的方法的不同实现的行为,并且基本上是通过继承的多态性的点,即

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)
    }
}
Run Code Online (Sandbox Code Playgroud)