web-dev-qa-db-ja.com

Javaオーバーロードとオーバーライド

こんにちは私はこれらの概念が正しいことを確認したいだけです。 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が返されます。

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

16
user69514

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

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

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

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

Robが指摘したように、私はあなたがoverridingを意味していると信じています。オーバーライドすると、戻り値の型を変更できないことに注意してください。 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 {}

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

32
Eddie

正しい;オーバーロードは、同じメソッドに複数の署名を提供します。

オーバーライド、つまり「上書き」とは、ベースタイプから継承されたメソッドの異なる実装を提供することであり、基本的には継承による多態性のポイントです。

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)
    }
}
6
Rob

あなたが述べたことは正しいです。

詳細については、ポリモーフィズムの概念をご覧ください。ウィキペディアには良い記事があります

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

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

0
Luixv