2011-09-09 31 views
1

我有一個類:超級構造函數不能正常工作如何,我認爲它應該

public abstract class LogicGate extends JPanel implements PropertyChangeListener { 

    private Image image; 
    private URL url; 
    private OutputTerminal output; 
    private Terminal input0; 
    private Terminal input1; 

    public LogicGate(String fileName) { 
     this.url = getClass().getResource(fileName); 
     this.image = new javax.swing.ImageIcon(url).getImage(); 
     this.setSize(image.getWidth(null), image.getHeight(null)); 
     this.output = new OutputTerminal(); 
    } 
} 

和子類:

public class ANDGate extends LogicGate { 

    private OutputTerminal output; 
    private Terminal input0; 
    private Terminal input1; 

    public ANDGate() { 
     super("images/AND.gif"); 
     System.out.println(this.output); 
    } 
} 

然而,當我調用一個新的ANDGate對象,output爲空,當它應該已經分配了(按照超級構造函數)。

現在很清楚,我在理解子類的構造函數時做了一個假設;我究竟做錯了什麼?

回答

7

這種情況被稱爲field hiding - 子類字段output是「隱藏」超類中相同名稱的字段。

你同時在你的超類你的子類中定義

private OutputTerminal output; 

。子類中對output的引用將在其字段中,但是您將輸出設置爲超類 - 子類字段將保留爲空。

要解決:

  • 刪除output聲明在子類中
  • 變化output在超類中聲明protected(這樣子類可以訪問它)
+0

那麼這一切固定。感謝:D –

3

兩個輸出變量是本地的,每個類 他們指的是兩個不同的成員。

你而從class ANDGate刪除

private OutputTerminal output; 

,並簡單地使用

System.out.println(output); 

private OutputTerminal output; 

protected超類。

1

您可以將超類中的類變量設置爲protected,並在system.out.println()行中使用'super'關鍵字而不是'this'。

示例代碼。

//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); 
} 

}

相關問題