Javaのオーバーロードとオーバーライド
-
10-07-2019 - |
質問
こんにちは、これらの概念が正しいことを確認したいだけです。 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を返します
両方の質問に対して私の知識は正しいですか
解決
あなたは基本的に正しいです。オーバーロードとは、メソッドが同じ名前を持つ単一のクラスに複数のメソッドがあることです。ただし、戻り値はメソッドの署名の一部とは見なされません。したがって、戻り値のみを変更してメソッドをオーバーロードすることはできません。あなたの例から、次のコードを持つことはできません:
public void setValue() {
this.value = 0;
}
public int setValue() {
return this.value;
}
これはコンパイルに失敗します。
ロブが特定したように、あなたはオーバーライドを意味していると思います、そしてあなたはそれを持っています。オーバーライドでは、戻り値の型を変更できないことに注意してください。 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 {}
最後に、オーバーロードとオーバーライドの大きな違いは見過ごされがちですが、オーバーロードはコンパイル時に決定され、オーバーライドは実行時に決定されます。これは、実行時に過負荷が決定されることを期待している多くの人々を驚かせます。
他のヒント
正しい;オーバーロードは、同じメソッドに複数の署名を提供しています。
オーバーライド。これは、「上書き」という意味です。基本型から継承されたメソッドの異なる実装を提供する行為であり、基本的には継承によるポリモーフィズムのポイントです。つまり、
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)
}
}
説明した内容は正しいです。
より明確にするために、ポリモーフィズムの概念を見てください。ウィキペディアには良い記事があります
http://en.wikipedia.org/wiki/Polymorphism#Computing
http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming