2010-06-15 77 views
21

我該如何着手爲實現接口的內部類編寫構造函數?我知道我可以做一個全新的類,但我想那裏一定是一個辦法做到沿着這行的東西:內部類中的構造函數(實現接口)

JButton b = new JButton(new AbstractAction() { 

    public AbstractAction() { 
     super("This is a button");       
    } 


    public void actionPerformed(ActionEvent e) { 
     System.out.println("button clicked"); 
    } 
}); 

當我進入這個它不承認AbstractAction方法構造(編譯器要求返回類型)。有人有想法嗎?

+6

當你達到匿名內部類可以做的限制時,那麼這是一個強烈的暗示,你應該寫一個正常的內部類。 – 2010-06-15 12:38:12

回答

35

只需插入參數擴展的類名稱之後:

JButton b = new JButton(new AbstractAction("This is a button") { 

    public void actionPerformed(ActionEvent e) { 
     System.out.println("button clicked"); 
    } 
}); 

此外,您還可以使用初始化塊:

JButton b = new JButton(new AbstractAction() { 

    { 
     // Write initialization code here (as if it is inside a no-arg constructor) 
     setLabel("This is a button") 
    } 

    public void actionPerformed(ActionEvent e) { 
     System.out.println("button clicked"); 
    } 
}); 
+0

完美回答我的問題,謝謝! – thepandaatemyface 2010-06-15 12:53:21

4

生成的類是AbstractAction類型的不但是一些(匿名,匿名)類型,它擴展/實現了AbstractAction。因此,這個匿名類的構造函數需要這個「未知」名稱,但不是AbstractAction

這就像普通分機/實施:如果你定義一個class House extends Building和構建House你的名字構造House而不是Building(或AbstractAction只是COM回到原來的問題)。

9

如果你真的需要無論出於何種原因一個構造器,那麼你可以使用一個初始化塊:

JButton b = new JButton(new AbstractAction() { 

    { 
     // Do whatever initialisation you want here. 
    } 

    public void actionPerformed(ActionEvent e) { 
     System.out.println("button clicked"); 
    } 
}); 

但是你不能從那裏調用一個超類構造函數。 Itay說雖然,你可以將你想要的參數傳遞給新的。

個人雖然,我將爲此創建一個新的內部類:

private class MyAction extends AbstractAction { 

    public MyAction() { 
     super("This is a button."); 
    } 

    public void actionPerformed(ActionEvent e) { 
     System.out.println("button clicked"); 
    } 
} 

則:

JButton b = new JButton(new MyAction()); 
1

編譯器是抱怨的原因是因爲你正在努力申報內部構造的匿名類,這是不允許匿名類具有的。就像其他人所說的,你可以通過使用實例初始化程序或將其轉換爲非匿名類來解決此問題,以便爲其編寫一個構造函數。