3

したがって、パッケージAにVehicleという名前のクラスがあり、パッケージBにCarという名前のクラスがあります。ClassCarはVehicleを拡張するため、Vehicleから特定の要素を継承します。私の質問は、Carは何を継承するのですか?

すべてのパブリックメソッドと変数を継承していると思いますが、私の割り当てでは、パッケージアクセス権(パブリックではなく、プライベートではない)を持つ変数があるので、Vehicle in Carからすべての変数を再宣言する必要がありますか?また、equals()メソッドを使用してCarオブジェクトとVehicleオブジェクトを比較できるかどうかは明確ではありません。これは、変数が同じ名前であっても同じではないためです。また、コンストラクターCarでsuper()を使用しているのに、どうしてすべての変数を再宣言する必要があるのでしょうか。変数はVehicleで開始されていませんか?また、Vehicleからすべての変数を再宣言する必要があるので、Vehicleから継承するすべてのパブリックメソッドは完全に役に立たないのでしょうか。パッケージアクセス権変数のみを持つクラスから継承することのポイントは何ですか?

4

1 に答える 1

1

間違えている。Vehicle クラスからすべてを継承します。パッケージで保護された要素は、サブクラスからアクセスできません。それだけです。したがって、これらのフィールドとメソッドにアクセスすることはできず、それらをオーバーライドすることもできません。しかし、それはそれらを再宣言する必要があるという意味ではありません。

例を見てみましょう。Vehicle クラスを設計し、サブクラスがオーバーライドして車両の色にアクセスできるようにするとします。しかし、サブクラスが車両のエンジンを台無しにしたくないとします。したがって、次のようになります。

public class Vehicle {
    private Engine engine;
    protected Color color = Color.BLACK;

    public Vehicle() {
        this.engine = new Engine();
    }

    public final void start() {
        System.out.println("starting engine...");
        engine.start();
        System.out.println("engine started");
    }

    public final Color getColor() {
        return this.color;
    }
}

public class Car extends Vehicle {

    public Car(Color color) {
        super();
        this.color = color;
    }
}

車は乗り物です。つまり、車を始動できるので、車も始動できます。そして、乗り物にはエンジンがあるので、車にもエンジンがあります。エンジンは Vehicle クラスに対してプライベートであるため、Car クラス内からエンジンを変更したり何かを実行したりすることはできませんが、車にはエンジンがあります。

ただし、colorフィールドは保護されています。これは、Car クラスがこのフィールドにアクセスできることを意味します。たとえば、コンストラクターで変更して、黒以外の色を使用できるようにします。

次のコードを試してください。

Car car = new Car();
car.start();

そして、エンジンが始動することがわかります。

于 2013-02-09T15:59:51.353 に答える