[英]Why do we use the “new” keyword with an Interface in Java?
我是Android的新手。 我已經學習了基本的面向對象編程課程,這些課程為課程提供了一種增強功能的方法。 實際上以這種方式增強其功能的類,實現這些接口並覆蓋在接口中編寫的所有方法。
以下代碼在Android中執行相同的工作:
public class MyActivity extends Activity implements OnClickListener {
// All other code you may expect
myButton.setOnClickListener(this);
@override
public onClick(View view) {
// Code when view is clicked
}
}
這段代碼是可以理解的。 但是下面的代碼對我來說沒有任何意義,我在不同的地方搜索過但沒有得到滿意的答案。
public class MyActivity extends Activity {
// All other code you may expect
myButton.setOnClickListener(new OnClickListner() {
@override
public onClick(View view) {
// Code when view is clicked
}
});
}
現在, OnClickListener()
是Android文檔中所說的接口,現在我們正在實例化一個接口。 不是只實現接口嗎? 請幫我理解這一點。
那些OnClickListeners是匿名類。 括號包括類定義。
如果對接口使用new,則必須通過{ }
塊中的接口覆蓋方法providerd,因為您創建了一個實現接口但沒有自己名稱的匿名內部類 。
這允許您例如具有多個不同的點擊處理程序,而無需為每個按鈕創建實現OnClickListner的類。
實際上,這是我在OOP中見過的最糟糕的做法之一,而不僅僅是java。
基本上,您從Interface
創建一個匿名內部類 ,您必須立即實現接口提供的所有方法。 在這種情況下考慮接口就像一個抽象類(它基本上總是,或多或少)。
雖然廣泛傳播,並且受到某些語言的適當支持,但java只支持語言級別的內部類的概念。 但是在字節代碼級別上,沒有內部類。 編譯器將這些內部類語言結構從其父類中刪除,除了它們之外還使用$ -sign和連續數字將它們作為兄弟,並將私有范圍元素(方法,變量)提升到包范圍。 現在讓它沉入片刻並考慮安全隱患。
接下來的事情是,這些匿名的內部類,因為它們在Android上下文中過度使用(原始問題被標記為Android)完全混亂了代碼並使其完全無法讀取。 這遠遠不是干凈的代碼 ,我強烈建議遵循這些代碼以維護易於閱讀和維護的代碼。
另一件事是每個new Interface() { ... };
自然地創造一個新的對象。 通常,您會在Android世界中與聽眾一起看到這一點。 如果您有多個監聽器,請為自己和用戶節省一些內存,並使用交換機實現一個對象...不要每次都創建一個新對象,因為Google示例會這樣做,並且因為有人在他們的示例中執行此操作在SO和教程或論壇中。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.