2013-10-26 153 views
1

有人可以爲我解釋這行代碼嗎?Java初始化抽象類

SomeAbstractClass variable = new SomeAbstractClass() { };

這正常instantiaties和變量存儲抽象的實例。發生什麼事?也許是一個擴展抽象類的匿名類?我可以使用任何關鍵字查找關於此的信息? (抽象類也恰好是通用的,如果它有相關性的話)

+1

你的問題中的關鍵字是匿名的,並延伸。 –

回答

6

上面這行代碼創建了一個匿名子類SomeAbstractClass,它不會是abstract。當然,這隻有在基類沒有實現abstract方法時纔有效。實際上,除非您正在實現和/或覆蓋花括號之間的方法,否則我無法想象上面這一行的有用實例(除了「文檔」功能,請參閱下面的註釋)。如果基類/接口碰巧實現的方法很少,並且實現很簡單,那麼這是一種非常常見的技術。你甚至可以參考周圍方法和參數的變量final,從而做出關閉。

+1

我在單元測試中的模擬對象中看到過它,真正的應用程序應該總是使用派生類。在這種情況下,'abstract'應該更像是一個文檔特性和一個警告,以避免創建基類的實例,而不是執行所需的實例。 – kiheru

+0

@kiheru不錯。我在答案中添加了一條指向您評論的指針。 –

+0

要引用周圍方法中的變量,它們也需要是「final」。即使他們是,匿名內部類只有*有效*作出封閉。這不是真的關閉。 – Vidya

0

您正在創建一個匿名類,它是您的abstract類的子類。就像在評論中指出的那樣,你正在尋找一個匿名擴展。

喜歡的東西如下會工作,如果你有abstract方法來實現:

MyAbstractClass someObjectOfThatClass = new MyAbstractClass(){ 
         @Override 
         public void someAbstractMethod(){ 

         } 
        } 

你可以做同樣的接口,它們還可以包含abstract方法。一個實際的例子是添加ActionListenerJButton

myJButton.addActionListener(new ActionListener(){ 
       @Override 
       public void actionPerformed(ActionEvent e){ 
        // code 
       } 
      }); 
+0

請格式化您的代碼。 –

+0

工作吧! –

+0

並刪除無意義的「匿名」參考。 –

0

的Java爲您提供了在線創建匿名子類的能力。您經常在具有Swing事件處理的匿名內部類的上下文中看到這一點,但也有許多其他應用程序。

在您的示例中,您將創建一個匿名擴展SomeAbstractClass並將其分配給SomeAbstractClass引用的類。就像如果你創建了一個單獨的類像這樣

public class SomeConcreteClass extends SomeAbstractClass { 
} 

,後來做了這個

SomeAbstractClass variable = new SomeConcreteClass(); 

正如@Stefano指出這將是,如果你的匿名混凝土類沒有抽象方法你的方法只能,這是真的,因爲SomeAbstractClass沒有抽象方法。