簡體   English   中英

為什么我們在Java中使用帶有接口的“new”關鍵字?

[英]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文檔中所說的接口,現在我們正在實例化一個接口。 不是只實現接口嗎? 請幫我理解這一點。

new OnClickListner() {沒有實例化一個接口,它聲明了一個匿名的內部類 基本上是一個匿名類(實現接口OnClickListner的類),它本身沒有名稱。

來自文檔

匿名類表達式包含以下內容:

  • 新的運營商
  • 要實現的接口的名稱或要擴展的類。 在此示例中,匿名類正在實現OnClickListner接口。
  • 括號,包含構造函數的參數,就像普通的類實例創建表達式一樣。 注意:在實現接口的情況下,沒有構造函數,因此您使用一對空括號,就像在此示例中一樣。
  • 身體,是一個類聲明體。 更具體地說,在正文中,方法聲明是允許的,但語句不是。

那些OnClickListeners是匿名類。 括號包括類定義。

如果對接口使用new,則必須通過{ }塊中的接口覆蓋方法providerd,因為您創建了一個實現接口但沒有自己名稱的匿名內部類

這允許您例如具有多個不同的點擊處理程序,而無需為每個按鈕創建實現OnClickListner的類。

實際上,這是我在OOP中見過的最糟糕的做法之一,而不僅僅是java。

基本上,您從Interface創建一個匿名內部類 ,您必須立即實現接口提供的所有方法。 在這種情況下考慮接口就像一個抽象類(它基本上總是,或多或少)。

雖然廣泛傳播,並且受到某些語言的適當支持,但java只支持語言級別的內部類的概念。 但是在字節代碼級別上,沒有內部類。 編譯器將這些內部類語言結構從其父類中刪除,除了它們之外還使用$ -sign和連續數字將它們作為兄弟,並將私有范圍元素(方法,變量)提升到包范圍。 現在讓它沉入片刻並考慮安全隱患。

接下來的事情是,這些匿名的內部類,因為它們在Android上下文中過度使用(原始問題被標記為Android)完全混亂了代碼並使其完全無法讀取。 這遠遠不是干凈的代碼 ,我強烈建議遵循這些代碼以維護易於閱讀和維護的代碼。

另一件事是每個new Interface() { ... }; 自然地創造一個新的對象。 通常,您會在Android世界中與聽眾一起看到這一點。 如果您有多個監聽器,請為自己和用戶節省一些內存,並使用交換機實現一個對象...不要每次都創建一個新對象,因為Google示例會這樣做,並且因為有人在他們的示例中執行此操作在SO和教程或論壇中。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM