私はかなりJavaに慣れていて、オブジェクト指向の設計とプログラミングの基礎を練習しています。継承、オブジェクトの作成、およびsuper()呼び出しの正しい使用に関するいくつかの質問があります。スーパークラスのコンストラクタコールの使用はここで必要ですか?
次の点を考慮してください:
スーパー、
package pet
public class Dog {
private String foodDogEats;
public Dog() {
this.foodDogEats;
}
public String getDogFood() {
return foodDogEats;
}
public void setDogFood() {
foodDogEats = "kibble";
}
}
サブクラス、
package pet
public class Fido extends Dog {
public Fido() {
super();
Dog dog = New Dog();
this.whatDoesFidoEat();
}
public whatDoesFidoEat(Dog dog) {
System.out.println("Fido eats " + dog.getDogFood());
}
}
とコントローラ。この例では
package pet
public class MyDogFido {
public void MyDogFido() {
Fido fido = new Fido();
}
}
オブジェクトは新しいFido
オブジェクトをインスタンス化し、そうすることの過程でwhatDoesFidoEat()
で印刷動作を実行するために、です。私はいくつか質問がある - 私はすでに(Dog
の延長である、と私は正しくリコール場合は、そのメソッドと変数を継承する)新しいFido
オブジェクトを呼び出しておりますので
を、Fido()
コンストラクタで新しいDog
オブジェクトのインスタンスであります冗長ですか?
super()
の使用についてはどうですか?
Dog
オブジェクトをFido()
にインスタンス化し、super()
、またはその両方を呼び出すことは正しい動作ですか?
私は最初、制御クラスで両方を使用して同様のコードを書きました。この質問を書いた後、私の腸は私に電話するべきであることを私に伝えていますsuper()
。
私のサンプルコード(特にDog()
コンストラクタのthis.foodDogEats;
行もコメントしてください)もお気軽にご利用ください。
ありがとうございます!
スーパークラスが 'private'データメンバを使用する場合、スーパークラスのget/setメソッドを使ってのみスーパークラスにアクセスできます。 'protected'を使うと、サブクラスが' this'を介してデータメンバーに直接アクセスできるようになります。スーパークラスの適切な機能に必要なget/setメソッドで何らかのロジックが発生する場合には、 'private'が使用されることがよくあります。 – RayfenWindspear
これは正確には問題ではありませんが、 'Fido()'コンストラクタで行ったように、コンストラクタからfinalではないメソッドを呼び出さないようにしてください。 'Fido'をサブクラス化して' getDogFood() 'メソッドをオーバーロードすると、予期せぬ動作が発生する可能性があります。 – Sam