2012-10-21 48 views
0

我的Java Swing的第一次使用,這是我第一次嘗試使用一個專用類。無法實例專用類

我想下面的代碼 -

ActionListener listener = new AddButtonListener(); 

哪裏AddButtonListener是實現ActionListener接口的私有類。

private class AddButtonListener implements ActionListener{ 
    public void actionPerformed(ActionEvent e){ 
    .... 
    } 
} 

不過,我得到一個錯誤日食讀取

型SOMETYPE沒有外圍實例訪問。必須通過封閉的someType類型實例(例如 x.new A()其中x是someType的實例)來限定 的分配。

請注意,該類正在someType中的靜態main方法中實例化。

這個錯誤爲什麼會出現?這是因爲主要方法是靜態的嗎?

+0

爲什麼AddButtonListener是私人的? – kosa

+0

因爲只有一個特定的按鈕,需要使用它 - 它是沒有意義的其他任何人知道這件事 – praks5432

+0

這是頂層類(在它自己的文件類)> – kosa

回答

5

由於AddButtonListener是一個內部類,而不是靜態的,它只能使用外部類的一個對象被實例化。

例如,如果你的AddButtonListener類是在SOMETYPE定義,然後

SomeType obj = new SomeType(); 

SomeType.AddButtonListener listener = obj.new AddButtonListener(); 

如果你是在SOMETYPE一些方法,那麼你將創建這個非靜態內部類的一個對象作爲

AddButtonListener listener = this.new AddButtonListener(); 

如果你想創建一個AddButtonListener的實例而不使用SomeType的實例(封閉類型),那麼你應該將AddButtonListener標記爲靜態類。

private static class AddButtonListener implementsActionListener{ 
    public void actionPerformed(ActionEvent e){ 
     .... 
    } 
} 

所以,它不是關於類是私有的,但它不是靜態的。

+0

好吧,我真正想要做的是有一個類來設置一個GUI(將一切正確添加到一堆幀並建立了聽衆) - 最好的方法是什麼? – praks5432

+1

由於一個AddButtonListener似乎並沒有什麼意義,而不圍框/窗口,我仍然把它作爲一個非靜態內部類和使用''this.new語法創建與收聽者的物體,並將其與關聯窗口控件(請參閱我的update.new語法更新)。 – Vikdor

2

異常消息幾乎解釋了所有。

private類需要其封閉類型的實例存在於爲了實例。由於私有類可以訪問封閉類型的實例中的成員,因此如果不存在這樣的實例,那麼私有類實例可以在封閉類型中訪問成員的位置?

回到你的問題。

如果您希望在不必創建其他實例來創建一個實例。您可以將您的AddButtonListener聲明爲private static class,但這會使AddButtonListener失去訪問SomeType級別成員的能力。

,或者你要使用這樣的語法。

SomeType t = new SomeType(); 
AddButtonListener listener = t.new AddButtonListener(); 

但是,由於您沒有提供任何明細代碼,所以無法確定您的情況是正確的。因爲根據我的經驗,當你在封閉類中使用私有類時,你不應該有這樣的問題。除非你想在一個主要方法還是其他什麼東西來測試它..

2

Vikdor是正確的。但對於這樣的情況下(監聽器只使用一次),你平時用的匿名類:通過擴展所需的接口或類

... 
ActionListener listener = new ActionListener(){ 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // TODO Auto-generated method stub   
    }  

}; 
... 

在這裏定義的類ONDE的方法內。