【问题标题】:Java overloading vs overridingJava重载与覆盖
【发布时间】:2010-10-24 16:25:14
【问题描述】:

您好,我只是想确保我的这些概念是正确的。 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

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

【问题讨论】:

  • 我不会使用 setValue() ,因为它设置的值不明确。 clearValue() 会更清晰,因此不需要重载。
  • 你的意思是覆盖而不是覆盖。覆盖对象的方法在 JavaScript 中被更频繁地讨论。 IE。 Object.toString = function(){ return "此函数已被覆盖";};

标签: java overloading overwrite


【解决方案1】:

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

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

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】:

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

    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 {}
    

    最后,重载和覆盖之间经常被忽视的一个很大区别是重载是在编译时决定的,而覆盖是在运行时决定的。当他们期望在运行时决定重载时,这让许多人感到意外。

    【讨论】:

      【解决方案3】:

      你所描述的是正确的。

      要了解更多信息,请查看多态性概念。维基百科有一篇很好的文章

      http://en.wikipedia.org/wiki/Polymorphism#Computing

      http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming

      【讨论】:

        猜你喜欢
        • 2013-04-05
        • 2022-01-10
        • 2012-05-21
        • 1970-01-01
        • 2016-02-08
        • 2016-03-24
        • 1970-01-01
        相关资源
        最近更新 更多