嗨,我只是想确保我有正确的这些概念。在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()
这将从Vehicle类返回20,000的价格
如果我打电话
truck.getPrice()
这将返回卡车类的价格,14,000
我的知识对于这两个问题都是正确的吗?
答案 0 :(得分:32)
你基本上是正确的。重载在单个类中具有多个方法,其中方法具有相同的名称。但是,返回值不会被视为方法的签名的一部分。因此,您不能通过仅更改返回值来重载方法。您的示例中不能包含以下代码:
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 {}
最后,重载和覆盖之间经常被忽视的一个重要区别是,在编译时决定重载,并在运行时决定覆盖。当他们希望在运行时决定重载时,这会让很多人感到意外。
答案 1 :(得分: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)
}
}
答案 2 :(得分:0)
你所描述的是正确的。
有关更多说明,请参阅多态概念。维基百科有一篇很好的文章
http://en.wikipedia.org/wiki/Polymorphism#Computing
http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming