17

こんにちは私はこれらの概念が正しいことを確認したいだけです。Javaでのオーバーロードとは、引数の数やデータ型が異なるコンストラクターまたはメソッドを使用できることを意味します。すなわち

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

この方法はどうですか?別のデータ型を返すため、それでもオーバーロードと見なされますか?

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

2番目の質問は: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が返されます。

私の知識は両方の質問に対して正しいですか?

4

3 に答える 3

35

あなたは基本的に正しいです。オーバーロードとは、メソッドの名前が同じである1つのクラスに複数のメソッドがあることです。ただし、戻り値はメソッドのシグネチャの一部としては表示されません。したがって、戻り値のみを変更してメソッドをオーバーロードすることはできません。あなたの例から、次のコードを持つことはできません:

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

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

これはコンパイルに失敗します。

ロブが特定したように、私はあなたがオーバーライドすることを意味すると信じています、そしてあなたはそれが正しいです。オーバーライドすると、リターンタイプを変更できないことに注意してください。Java 5以降、基本クラスのメソッドが返したものの派生型を返すことができます。Java 5より前では、同じタイプである必要があります。つまり、Java5以降まで以下を実行することはできません。

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

最後に、見過ごされがちなオーバーロードとオーバーライドの大きな違いは、オーバーロードはコンパイル時に決定され、オーバーライドは実行時に決定されることです。これは、実行時にオーバーロードが決定されることを期待しているときに、多くの人を驚かせます。

于 2009-05-08T01:50:18.853 に答える
7

正しい; オーバーロードとは、同じメソッドに複数のシグニチャを提供することです。

「上書き」とは、基本型から継承されたメソッドの異なる実装を提供する行為であり、基本的には継承によるポリモーフィズムのポイントです。

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)
    }
}
于 2009-05-08T01:40:23.417 に答える
0

あなたが説明したことは正しいです。

より明確にするために、ポリモーフィズムの概念を見てください。ウィキペディアには良い記事があります

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

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

于 2009-05-08T01:50:52.503 に答える