2011-10-15 96 views
0

我想我明白匿名類的基礎知識,但我想澄清一些事情。 時,我有一個語法像這樣匿名類難題

class A 
{ 
     class AnonymousClass1 Implements ActionListener{} 
} 
class A 
{ 
    public A() 
    { 
     JButton btn = new JButton(); 

     btn.addActionListener(new ActionListener(){}); 
    } 
} 

如果匿名類實際上是一個內部類A級的,如在第一個例子:從理論上講,是語義正確的?

究竟發生了什麼?我認爲,當編譯java文件時,會爲匿名類創建一個.class文件,以便它可以被引用(但我找不到它)。當A的一個對象被實例化時,它創建一個按鈕對象,然後btn調用實際上傳遞類似於此的addActionListener()方法。AnonymousClassOne是編譯器給出的通用名稱。

如果不是會發生什麼?謝謝。

回答

2

Anonymous類別可以通過美元符號和後面的數字來識別 - Class$1.class。這些課程只是爲了您的方便。想象一下:

class SaveButtonListener implements ActionListener { 
    ... 
} 

class OpenButtonListener implements ActionListener { 
    ... 
} 

這是非常單調乏味的。所以你可以使用匿名類創建實現。編譯器給出名稱後面加上美元符號和一些標識符。

幕後發生的事情是,Java用自動生成的名稱創建一個新的內部類。

如果您發現我的解釋雜亂,請隨時提問。我現在很累。

+0

笑我看到啦!這太棒了。這不是在Eclipse中,我正在看錯誤的地方。很好,謝謝。有趣的是,它實際上使用classname $ Digit作爲匿名類名。很酷! –

+0

@Lews Therin - 不客氣:) –

+0

你爲什麼不在Java房間裏閒逛?我們一直都在那裏大聲笑 –

1
class A 
{ 
    public A() 
    { 
     JButton btn = new JButton(); 
     btn.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       // ... 
      } 
     }); 
    } 
} 

由編譯器或多或少地改寫爲

class A 
{ 
    private class SomeCuteName implements ActionListener 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      // ... 
     } 
    } 

    public A() 
    { 
     JButton btn = new JButton(); 
     btn.addActionListener(new SomeCuteName()); 
    } 
}