2011-09-09 15 views
1

私はクラスを持つべきだと思うか動作していませんスーパーコンストラクターごとに割り当てられている必要があります。スーパーコンストラクタは、私はそれが

ここでは、明らかに、サブクラス化コンストラクタを理解する上での前提がありました。私は何を間違えているのですか?

答えて

7

この状況をfield hidingと呼びます。サブクラスフィールドoutputは、スーパークラスの同じ名前のフィールドを「隠しています」。

あなたはスーパークラスサブクラスの両方に

private OutputTerminal output; 

を定義しています。サブクラスのoutputへの参照はそのフィールドになりますが、スーパークラスの出力を設定しています。サブクラスフィールドはnullのままです。

は修正するには:

  • は、サブクラスで
  • 変更protectedに、スーパークラスのoutputの宣言(そのサブクラスがそれにアクセスすることができます)
+0

まあ。ありがとう –

3

両方をoutputの宣言を削除します出力変数はローカルの各クラス の2つの異なるメンバを参照します。

あなたはむしろclass ANDGateから

private OutputTerminal output; 

を削除し、単に

System.out.println(output); 

を使用し、スーパークラスの

private OutputTerminal output; 

protectedしてください。

1

スーパークラスのclass変数をprotectedとして作成し、system.out.println()行に 'this'の代わりに 'super'キーワードを使用することができます。

あなたのためのコード例。すべてを固定

//superclass 
class A { 
protected int a; 

public A(){ 
    a=50; 
} 
} 

//sublcass 
class B extends A{ 

private int a; 

public B(){ 
    super(); 
    System.out.println(super.a); 
} 

}

関連する問題