0

ちょっと継承を練習していて、問題が発生しました。車のクラス (サブクラス) で、車両 (親) の変数が表示されないというエラーが発生します。私はこれを変更するために何もしませんでしたし、非表示にする方法さえ知りません。誰でもこれで私を助けることができますか?

public class Vehicle 
{
    private String make, model, colour;
    private int registrationNumber;

    public Vehicle()
    {
        this.make = "";
        this.model = "";
        this.colour = "";
        this.registrationNumber = 0;


    }


    public Vehicle(String make, String model, String colour,
            int registrationNumber) 
    {
        this.make = make;
        this.model = model;
        this.colour = colour;
        this.registrationNumber = registrationNumber;
    }


    public String getMake() 
    {
        return make;
    }


    public void setMake(String make) 
    {
        this.make = make;
    }


    public String getModel() 
    {
        return model;
    }


    public void setModel(String model) 
    {
        this.model = model;
    }


    public String getColour() 
    {
        return colour;
    }


    public void setColour(String colour) 
    {
        this.colour = colour;
    }


    public int getRegistrationNumber() 
    {
        return registrationNumber;
    }


    public void setRegistrationNumber(int registrationNumber) 
    {
        this.registrationNumber = registrationNumber;
    }



    public String toString() 
    {
        return "Vehicle [make=" + make + ", model=" + model + ", colour="
                + colour + ", registrationNumber=" + registrationNumber + "]";
    }






}

public class Car extends Vehicle
{
private int doors;
private String shape;

public Car()
{
    super();
    this.doors = 0;
    this.shape = "";
}

public Car(String make, String model, String colour, int registrationNumber) 
{
    super(make, model, colour, registrationNumber);
    this.make = make;
    this.model = model;
    this.colour = colour;
    this.registrationNumber = registrationNumber;


}






}

エラーメッセージ:

Description Resource    Path    Location    Type
The field Vehicle.make is not visible   Car.java    /VehicleApp/src line 19 Java Problem
The field Vehicle.model is not visible  Car.java    /VehicleApp/src line 20 Java Problem
The field Vehicle.colour is not visible Car.java    /VehicleApp/src line 21 Java Problem
The field Vehicle.registrationNumber is not visible Car.java    /VehicleApp/src line 22 Java Problem
4

5 に答える 5

7

「問題」は、変数がprivateであるため、サブクラスで使用できないことです。おそらく、それらに直接アクセスしようとしていますCar(ソースを含めていないため、わかりにくいです)。

それらを保護された変数にすることもできprivateますが、そのままにして、代わりにサブクラスのプロパティ (get メソッドと set メソッド) を使用することを強くお勧めします。フィールドは実装の詳細です。サブクラスや他のコードに公開するAPIを検討する必要があります。

Java でのアクセス制御の詳細については、JLS セクション 6.6を参照してください。例えば:

それ以外の場合、メンバーまたはコンストラクターが宣言されている場合、privateメンバーまたはコンストラクターの宣言を囲む最上位クラス (§7.6) の本体内で発生した場合にのみ、アクセスが許可されます。

于 2012-10-19T16:52:07.347 に答える
5

private変数は表示されません。それらは、定義されているクラスだけに制限されています。protected変数 (および関数) は、サブクラスに表示されます。

変化する:

private String make, model, colour;
private int registrationNumber;

protected String make, model, colour;
protected int registrationNumber;

非公開にすることは、Carが からこれらの変数を継承しないことを意味するため、お勧めしませんVehicleCarにそれ自身の親のゲッターとセッターを強制的に呼び出すと、 と の間Carにギャップが生じVehicleます。Caraには色、メーカー、モデル、または登録番号がないと言っているように聞こえますが、別のクラス( Vehicle)に行き、クラスに色、メーカー、モデル、および登録番号を尋ねる必要があります.

于 2012-10-19T16:51:15.633 に答える
2

あなたのVehicleメンバーは非公開です。Vehicleしたがって、それらはクラス以外の誰にも見えません。詳しくはこちらをご覧ください。

于 2012-10-19T16:51:26.060 に答える
2

super(...)スーパーコンストラクターを使用する場合、コンストラクター呼び出しがこれを行うため、親フィールドを設定する必要はなく、実際には設定しないでください。

public Car(String make, String model, String colour, int registrationNumber) 
{
    super(make, model, colour, registrationNumber);

    // get rid of these:
    // this.make = make;
    // this.model = model;
    // this.colour = colour;
    // this.registrationNumber = registrationNumber;
}
于 2012-10-19T17:15:01.747 に答える
1

変数:

private変数がそのクラス内でのみ表示されることを意味します。例えば

Class foo {
    private Object a; //a can only be accessed within foo.
}

protectedそのクラスと継承するクラスを意味します。例えば

Class foo {
    protected Object a;
}

Class bar extends foo {
    public bar () {
        a = someVariable;
    }
}

publicそのクラスのオブジェクトにアクセスできるすべてのクラスを意味します。例えば

Class foo{
    public Object a;
}

Class bar{
    public bar(){
        foo foo = new foo();
        foo.a = someVariable;
    }
}
于 2012-10-19T16:58:18.970 に答える