0

継承に関連するJavaの章を勉強していますが、いくつか質問があります。

継承がどのように機能するか(メソッドのオーバーライド、情報の非表示、サブクラスのスーパークラスのプライベートフィールドの使用方法など)については基本的に理解していますが、問題が1つだけあり、お役に立てば幸いです。

スーパークラスにデフォルト以外のコンストラクター(パラメーターなし)がある場合、サブクラスで新しいコンストラクターを作成する必要があります(デフォルトの場合もあります-パラメーターなし)が、最初のステートメントではスーパークラスコンストラクター呼び出しである必要があります。

わかりました、これまでのところとても良いです。私はこれまで理解しています。サブクラスでは、コンストラクターパラメーターのいずれかに一致するスーパークラスコンストラクターを呼び出す必要があります。

しかし、次のコードを確認しましょう:(スーパークラス)

public class Vehicle {

    private int numOfWheels;
    private double avgGallonsPerMile;   

    public Vehicle(int numOfWheels, double avgGallonsPerMile) {

        this.numOfWheels = numOfWheels;
        this.avgGallonsPerMile = avgGallonsPerMile;
    }
}

そして別のサブクラスコード:

public class Car extends Vehicle{

    public Car(double avgGallonsPerMile) {
        super(What should i write here?, avgGallonsPerMile);

        //force numOfWheels to 4;

    }   
}

サブクラスの演習は次のとおりです。

各サブクラスには、ガロンあたりのマイル数の値を引数として受け入れ、ホイールの数を適切な値(モーターサイクルの場合は2、車の場合は4)に強制するコンストラクターが含まれています。

サブクラスコンストラクターでは、 numOfWheelsフィールドは必要ありません。とにかく、4(車の場合)と2(バイクの場合)に強制するからです。

しかし、とにかくスーパークラスのためにそのデータが必要です。そのデータはどこで入手できますか?スーパークラスコンストラクターの呼び出しの最初のパラメーターとして何をすべきか。

しかし、それでもこれは孤独なケースではありません。サブクラスコンストラクターの特定のデータをパラメーターとして必要としない演習がたくさんありましたが、それでもスーパークラスコンストラクターの呼び出しでそれらが必要です。

そのような場合はどうすればよいですか?

私が伝えたいことを、あなたが私を理解してくれたことを本当に願っています。ちょっと難しいです。

4

3 に答える 3

2

とにかく、車の場合は4つ、オートバイの場合は2つと同じであれば、修正すれば作成できます。

super(4, avgGallonsPerMile);

またはより良い方法-定数を宣言します:

private static final int NUM_OF_WHEELS = 4;
..
super(Car.NUM_OF_WHEELS, avgGallonsPerMile);
于 2012-09-25T14:21:45.530 に答える
2

スーパークラスにフィールドが必要ない場合は、そこにあるべきではない可能性があります。代わりに、次のことを行うことができます。

public abstract class Vehicle {
    private final double avgGallonsPerMile;

    public Vehicle(double avgGallonsPerMile) {
       this.avgGallonsPerMile = avgGallonsPerMile;
    }
    public double getAvgGallonsPerMile() { return avgGallonsPerMile; }
    public abstract int getNumOfWheels();
}

public class Car extends Vehicle{
    public Car(double avgGallonsPerMile) {
       super(avgGallonsPerMile);
    }
    public int getNumOfWheels() { return 4; }
}

public class Bicycle extends Vehicle{
    public Bicycle (double avgGallonsPerMile) {
       super(avgGallonsPerMile);
    }
    public int getNumOfWheels() { return 2; }
}

public class Tricycle extends Vehicle{
    public Tricycle (double avgGallonsPerMile) {
       super(avgGallonsPerMile);
    }
    public int getNumOfWheels() { return 3; }
}

ところで:燃料1マイルあたりのガロンを使用する場合、あなたの車は本当に非効率的でなければなりません。

于 2012-09-25T14:22:37.300 に答える
1

非常に単純です。aのホイールの数Carが常に4の場合、値4を渡すだけです。

public Car(double avgGallonsPerMile) {
   super(4, avgGallonsPerMile);

    // ...
}
于 2012-09-25T14:17:36.413 に答える