0

手始めに、私は質問を十分に表現したことを望みます。そうでない場合は、自由に編集するか、変更を提案してください。
私は大学のコースを支援するためにJavaの教科書を調べていますabstract classが、B747、B757、B767の3つのサブクラスで飛行機を作成するように求める演習に出くわしました。これらの3つのサブクラスの各オブジェクトには、一意のシリアル番号があります。

質問の他の多くの部分を切り取って(私は関係がないことを願っています!)、私はこれを行いました:

public abstract class Airplane {
    String serialNumber;

    public String toString() {
    return getClass().getName() + ": " + serialNumber
    }
}

次に、3つのサブクラスを宣言しました。各サブクラスは、次のようになります。

public class B747 extends Airplane {
    B747(String serial) {
    serialNumber = serial;
    }
}

最後に、メインプログラムで、次のコードを使用して新しいオブジェクトをインスタンス化しました。

Airplane a = new B747("ABC101");
System.out.println ("Airplane a: " + a);

これで、コードは正常に機能します。しかし、私が本の答えを見たとき、彼らはそれを別の方法で行うことを選びました。彼らは同じ方法で各オブジェクトをインスタンス化しましたが、代わりに各クラスに次のメソッドがありました。

public B747 (String serial) {
    super (serial);
}

抽象スーパークラスの飛行機では、彼らはそれから持っていました:

public Airplane (String serial) {
    this.serial = serial;
}

これは、文字列をスーパークラスに昇格させてそこで行動するという個人的な好みの問題でしたか、それともセキュリティかどうかにかかわらず、これは何らかの利点を提供しますか?

4

2 に答える 2

8

これは、文字列をスーパークラスに昇格させてそこで行動するという個人的な好みの問題でしたか、それともセキュリティかどうかにかかわらず、これは何らかの利点を提供しますか?

変数がアクセスされる場所のみが変更され、宣言される場所は変更されません。そしてそれは良いことです:

  • すべてにシリアル番号が必要なので、クラスがそれを強制するAeroplaneのは理にかなっていますAeroplane
  • これにより、フィールドを内にprivate(およびfinal)含めることができAeroplane、「ゲッター」を使用して、必要な範囲でフィールドへの読み取り専用アクセスを提供できます。

両方の部分が重要ですが、最初の側面について確信が持てない場合は、さらにいくつかのサブクラスがある場合にどうなるかを検討してください。本当にすべてのサブクラスで割り当てを実行したいですか?暗黙的であろうと明示的であろうと、常にスーパーコンストラクターの呼び出しがありますが、割り当てを繰り返す理由はありません。

私は間違いなくあなたの本の解決策よりも本の解決策を好みます-特に彼らがフィールドprivateとを作るならfinal。私のコードでは、定数以外の非プライベートフィールドを使用することはほとんどありません。

于 2013-02-07T23:07:43.513 に答える
0

また、super()はスーパークラスコンストラクター(Aeroplane)の単なる呼び出しであり、(私が知る限り)クラス階層を作成するときは、スーパークラスコンストラクターを呼び出すのが一般的です。「this」や「super」のようなキーロッドがあり、階層内のsuper / sub(child)クラスの値であるかどうかを定義します。Javaは通常、フィールド値の名前を単純に記述したかどうかを認識しますが、実際には、「this」の部分をそこに配置することは秘密にされています。

于 2013-02-07T23:19:53.433 に答える