2013-10-11 6 views
9

フィールドをパラメータとして受け取り、それをスーパークラスに格納されているフィールドに配置するコンストラクタを作成しようとしています。ここで私は、私は "エラーを取得しています私はJavaのサブクラスコンストラクタからスーパークラスを呼び出す

private String flavour; 

でフィールドを初期化していると私はアクセサメソッド

public String getFlavour() { 
    return flavour; 
} 

を持っているスーパークラスでは

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

を使用していたコードですフレーバはスーパークラスでプライベートアクセスを持っていますが、フィールドに返すアクセサメソッドを呼び出しているので、これは問題ではないと思いますか?

+0

あなたが持っているものはうまくいくはずです。本当のコードを見せてくれるのですか? –

+1

問題を再現するために[SSCCE](http://sscce.org)を投稿してください。 –

+0

'title'は' crisps'または親クラスで宣言されていますか? –

答えて

15

あなたは何をすべき:チップスクラスで

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

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

 

共同

あなたのスーパークラスにコンストラクタを追加します。 mments

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

それが宣言され、これは初期設定ではありません

private String flavour; 

「スーパークラスでは、私がして、フィールドを初期化しています」。初期設定は、値を設定するときです。

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

アクセサー(別名ゲッター)を呼び出すと、それは問題ありません。ゲッターの可視性によって異なります。味はチップスクラスで宣言フィールドはありませんが、夕食のクラスにいるので、あなたがそのような直接的なアクセスを行うことができないので、

this.flavour = 

:あなたのコードで 問題があります。あなたは私の提案を使用するか、スーパークラスにセッターを宣言する必要があります。

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

その後、あなたは子クラスでそれを使用することができます。

public Crisps(String flavour, int quantity) { 
    this.quantity = quantity; 
    setFlavour(flavour); 
} 
+0

@ ipinto.euあなたの答えが正しい間にあなたの答えが正しいとしたら、あなたの答えの中の最後の代替解決法(スーパークラスのセッターを使用して)は継承のルールに違反していると思います。 "[オーバーライド可能なメソッド呼び出しをコンストラクタ](https://stackoverflow.com/questions/3404301/whats-wrong-with-overridable-method-calls-in-constructors) "の問題です。したがって、最後の代替ソリューションは実際のソリューションではありませんが、コード内にバグが発生します。私は、* super.setFlavour(フレーバー)*が動作するはずだと思います。 –

+0

私は理解し、同意します。私は、議論のための例だったと言わなければならない。私はスーパーを使ってそれを呼び出すというあなたの提案が好きです。他のオプション(および異なる哲学)は、セッターを最終的にすることです(上書きすることはできません)。 –

1

flavourはプライベートです。パブリックメソッドから読み込んでいますが、それをプライベートフィールドに割り当てていますが、このクラスで宣言していない可能性があります。

あなたは最終的にあなたのコードは実際にも意味がありません。親クラスでprotectedに風味を設定したり、それ

用セッターを定義できます。たとえそれがコンパイルされたとしても、多かれ少なかれ:flavour = flavourです。おそらく、あなたは少しやろうとしていることを考え直さなければならないでしょう。

私は、Javaとオブジェクト指向プログラミングをより緊密に理解する必要があると思います。

http://docs.oracle.com/javase/tutorial/java/concepts/

あなたはここに開始する必要があります。

+0

と言っているはずですが、とにかくパブリックメソッドgetFlavourへの呼び出しでそれを行うには? – user215732

+0

@ user215732 'getFlavour'はそれだけです。それは '風味'を得る。これを使用してフレーバーに値を割り当てることはできません。可変オブジェクトを返した場合は、実際のフレーバーを変更できますが、この場合は文字列は変更できません。 – Cruncher

+1

@ user215732あなたの 'crisps'コンストラクタには' flavour'というパラメータがありますが、あなたのコードは現在書かれているので、何もしません。 – ajb

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

これはsee Docs

として動作するはずです
1

make

private String flavour; 

publicでなければ、サブクラスはこのStringにアクセスできません。 スーパークラスはサブクラスの存在を認識しません。 Javaのドキュメントによると、 "private"はその変数とメソッドをそのクラス内で利用可能にします。ここでは、プライベート変数やメソッドが宣言されています。 アクセス修飾子を入力すると、エラーは発生しません。

関連する問題