web-dev-qa-db-ja.com

Javaのサブクラスコンストラクターからスーパークラスを呼び出す

フィールドをパラメーターとして受け取り、スーパークラスに格納されているフィールドに配置するコンストラクターを作成しようとしています。これが私が使っているコードです

public crisps(String flavour, int quantity) {
    this.flavour = super.getFlavour();
    this.quantity = quantity;
}

スーパークラスで、私はフィールドを初期化しました

private String flavour;

と私はアクセサーメソッドを持っています

public String getFlavour() {
    return flavour;
}

フレーバーはスーパークラスにプライベートアクセスがあります」というエラーが発生しますが、フィールドに返すアクセサーメソッドを呼び出しているので、これは問題ではないと思いますか?

12
user215732

すべきこと:

スーパークラスにコンストラクターを追加します。

public Superclass {
    public SuperClass(String flavour) {
       // super class constructor
       this.flavour = flavour;
    }
}

Crispsクラス:

public Crisps(String flavour, int quantity) {
    super(flavour); // send flavour to the super class constructor
    this.quantity = quantity;
}

コメント

あなたの質問に対するいくつかのコメント:

「スーパークラスでフィールドを初期化しました」

private String flavour;

これは初期化ではなく、宣言です。初期化とは、値を設定するときです。

「「フレーバーにはスーパークラスでプライベートアクセスがあります」というエラーが発生しますが、フィールドに返すアクセサーメソッドを呼び出しているので、これは問題ではないと思いますか?」

アクセサー(別名getter)を呼び出すときは問題ありません-getterの可視性に依存します。あなたのコードの問題は:

this.flavour = 

フレーバーはCrispsクラスで宣言されたフィールドではなく、夕食クラスで宣言されているため、そのような直接アクセスはできません。私の提案を使用するか、セッターをsuper classで宣言する必要があります。

public void setFlavour(String flavour) {
    this.flavour = flavour;
}

次に、それを子クラスで使用できます。

public Crisps(String flavour, int quantity) {
    this.quantity = quantity;
    super.setFlavour(flavour);
}
20
lpinto.eu
public crisps(String flavour, int quantity)
{
    super(flavour);
    this.quantity = quantity;
}

これは ドキュメントを参照 として機能するはずです。

2
HansB

make

    private String flavour;

それ以外の場合、サブクラスはこの文字列にアクセスできません。スーパークラスは、サブクラスの存在を認識していません。 Javaのドキュメントによると、「プライベート」はそのクラス内で変数とメソッドを使用できるようにします。プライベート変数またはメソッドが宣言されている場合、どのクラスもそれにアクセスできません。サブクラスであってもです。アクセス修飾子を使用すると、エラーは発生しません。

2
Aida Isay

flavourは非公開です。パブリックメソッドから読み取っていますが、プライベートフィールドに割り当てているため、このクラスで宣言していない可能性があります。

親クラスでフレーバーをprotectedに設定するか、そのセッターを定義できます

結局のところ、コードは実際には意味がありません。コンパイルできたとしても、多かれ少なかれ:flavour = flavour。たぶん、あなたはあなたが少ししようとしていることを再考する必要があります

Javaとオブジェクト指向プログラミング。

http://docs.Oracle.com/javase/tutorial/Java/concepts/

ここから始めましょう。

2
Cruncher