一 點睛
匿名內部類適合創建那種只需要一次使用的類,定義匿名內部類的語法格式" />

Java匿名內部類原理與用法詳解

 更新時間:2019-09-29 10:00:38   作者:佚名   我要評論(0)

本文實例講述了Java匿名內部類原理與用法。分享給大家供大家參考,具體如下:
一 點睛
匿名內部類適合創建那種只需要一次使用的類,定義匿名內部類的語法格式

本文實例講述了Java匿名內部類原理與用法。分享給大家供大家參考,具體如下:

一 點睛

匿名內部類適合創建那種只需要一次使用的類,定義匿名內部類的語法格式如下:

new 父類構造器(實參列表) | 實現接口()
{
   //匿名內部類的類體部分
}

從上面的定義可以看出,匿名內部類必須繼承一個父類,或實現一個接口,但最多只能繼承一個父類,或實現一個接口。

兩條規則。

  • 匿名內部類不能是抽象類。
  • 匿名內部類不能定義構造器。由于匿名內部類沒有類名,所以無法定義構造器,但匿名內部類可以初始化塊,可以通過初始化塊來完成構造器需要完成的工作。

二 實戰

1 點睛

最常用的創建匿名內部類的方式是創建某個接口類型的對象。

2 代碼

interface Product
{
  public double getPrice();
  public String getName();
}
public class AnonymousTest
{
  public void test(Product p)
  {
   System.out.println("購買了一個" + p.getName()
     + ",花掉了" + p.getPrice());
  }
  public static void main(String[] args)
  {
   AnonymousTest ta = new AnonymousTest();
   // 調用test()方法時,需要傳入一個Product參數,
   // 此處傳入其匿名內部類的實例
   ta.test(new Product()
   {
     public double getPrice()
     {
      return 567.8;
     }
     public String getName()
     {
      return "AGP顯卡";
     }
   });
  }
}

3 運行

購買了一個AGP顯卡,花掉了567.8

4 說明

定義匿名內部類無須class關鍵字,而是在定義匿名內部類時直接生成該匿名內部類的對象。

由于匿名內部類不能是抽象類,所以匿名內部類必須實現它的抽象父類或接口里包含的所有抽象方法。

三 實戰

1 點睛

當通過接口來創建匿名內部類時,匿名內部類不能顯示創建構造器,因此匿名內部類里只有一個隱式的無參構造器,故new接口名后的括號里不能傳入參數值。

如果通過繼承父類來創建匿名內部類時,匿名內部類將擁有和父類相似的構造器,此處的相似指的是擁有相同的形參列表。

2 代碼

abstract class Device
{
  private String name;
  public abstract double getPrice();
  public Device(){}
  public Device(String name)
  {
   this.name = name;
  }
  // 此處省略了name的setter和getter方法
  public void setName(String name)
  {
   this.name = name;
  }
  public String getName()
  {
   return this.name;
  }
}
public class AnonymousInner
{
  public void test(Device d)
  {
   System.out.println("購買了一個" + d.getName()
     + ",花掉了" + d.getPrice());
  }
  public static void main(String[] args)
  {
   AnonymousInner ai = new AnonymousInner();
   // 調用有參數的構造器創建Device匿名實現類的對象
   ai.test(new Device("電子示波器")
   {
     public double getPrice()
     {
      return 67.8;
     }
   });
   // 調用無參數的構造器創建Device匿名實現類的對象
   Device d = new Device()
   {
     // 初始化塊
     {
      System.out.println("匿名內部類的初始化塊...");
     }
     // 實現抽象方法
     public double getPrice()
     {
      return 56.2;
     }
     // 重寫父類的實例方法
     public String getName()
     {
      return "鍵盤";
     }
   };
   ai.test(d);
  }
}

3 運行

購買了一個電子示波器,花掉了67.8
匿名內部類的初始化塊...
購買了一個鍵盤,花掉了56.2

當創建以Device為父類的匿名內部類時,既可以傳入參數,代表調用父類帶參數的構造器;也可以不傳入參數,代表調用父類無參數的構造器。

當創建匿名內部類時,必須實現接口或抽象父類里的所有抽象方法。如果有需要,也可以重寫父類中的普通方法。

四 實戰

1 點睛

在Java 8之前,Java要求被局部內部類、匿名內部類訪問的局部變量必須使用final修飾,從Java 8開始這個限制取消了,Java 8更加智能:如果局部變量被匿名內部類訪問,那么該局部變量相對于自動使用了final修飾。

2 代碼

interface A
{
  void test();
}
public class ATest
{
  public static void main(String[] args)
  {
   int age = 8;   // ①
   // 下面代碼將會導致編譯錯誤
   // 由于age局部變量被匿名內部類訪問了,因此age相當于被final修飾了
   //age = 2;
   A a = new A()
   {
     public void test()
     {
      // 在Java 8以前下面語句將提示錯誤:age必須使用final修飾
      // 從Java 8開始,匿名內部類、局部內部類允許訪問非final的局部變量
      System.out.println(age);
     }
   };
   a.test();
  }
}

3 結果

8

4 說明

Java 8將這個功能稱為“effectively final”,它的意思是對于被匿名內部類訪問的局部變量,可以用final修飾,也可以不用final修飾,但必須按照有final修飾的方式來使用——也就是一次賦值后,以后不能重新賦值。

更多java相關內容感興趣的讀者可查看本站專題:《Java面向對象程序設計入門與進階教程》、《Java數據結構與算法教程》、《Java操作DOM節點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》

希望本文所述對大家java程序設計有所幫助。

您可能感興趣的文章:

  • 簡單談談java中匿名內部類構造函數
  • 在java中 利用匿名內部類進行較簡潔的雙括弧初始化的方法
  • java中匿名內部類詳解
  • Java中的匿名內部類小結
  • java中的匿名內部類詳細總結
  • Java匿名對象與匿名內部類
  • 詳談Java編程之委托代理回調、內部類以及匿名內部類回調(閉包回調)
  • Java 匿名內部類詳解及實例代碼
  • java 中匿名內部類的實例詳解
  • java中的匿名內部類總結
  • Java局部內部類和匿名內部類定義與用法實例分析

相關文章

  • Java匿名內部類原理與用法詳解

    Java匿名內部類原理與用法詳解

    本文實例講述了Java匿名內部類原理與用法。分享給大家供大家參考,具體如下: 一 點睛 匿名內部類適合創建那種只需要一次使用的類,定義匿名內部類的語法格式
    2019-09-29
  • Vbs備份指定文件到指定目錄并且以日期重命名的實現代碼

    Vbs備份指定文件到指定目錄并且以日期重命名的實現代碼

    說到備份,相信大家都會想到的第一個方法就是通過windows系統自帶的window backup功能進行數據備份。后來微軟又出了system centere產品后,就出現了一個新的備
    2019-09-29
  • json字符串對象轉換代碼實例

    json字符串對象轉換代碼實例

    這篇文章主要介紹了json字符串對象轉換代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下 1、將字
    2019-09-29
  • JavaScript獲取頁面元素的常用方法詳解

    JavaScript獲取頁面元素的常用方法詳解

    1、通過標簽獲取元素,返回一個數組   var li = document.getElementsByTagName('li');//標簽獲取元素   li[0].innerHTML;// 查看獲取元素的內容   l
    2019-09-29
  • VBS一鍵配置VOIP腳本代碼

    VBS一鍵配置VOIP腳本代碼

    代碼比較長,對vbs感興趣的朋友可以參考一下 Dim ws,fso,IE Set IE = WScript.createobject("InternetExplorer.Application") Set
    2019-09-29
  • 使用vbs腳本實現自動打字祝福與搞笑實現代碼

    使用vbs腳本實現自動打字祝福與搞笑實現代碼

    概述 聽說抖音上流行一種用代碼做程序表白的東西,,,, 當然我也不是要表白,,,, 但是好像蠻有意思的,,,, 于是,又學了一下vbs腳本,做了幾個
    2019-09-29
  • javascript頭像上傳代碼實例

    javascript頭像上傳代碼實例

    上傳頭像: 相關關鍵詞: ondragover(拖動元素在投放區內移動) ondrop (元素放在投放區觸發但是要去處理瀏覽器默認事件的影響:ondragenter、ondragover)
    2019-09-29
  • JavaScript實現輪播圖效果代碼實例

    JavaScript實現輪播圖效果代碼實例

    這篇文章主要介紹了JavaScript實現輪播圖效果代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-29
  • VBS批量重命名文件并且操作前備份原有文件

    VBS批量重命名文件并且操作前備份原有文件

    核心函數 '========================================================================== ' ' VBScript Source File -- Created with SAPIEN Technologies
    2019-09-29
  • 解決layui批量傳值到后臺操作時出現傳值為空的問題

    解決layui批量傳值到后臺操作時出現傳值為空的問題

    如圖,前臺的樣子,data的參數為 [ {"good_id":1,"good_name":"標樣-總磷","good_num":"BY400014","pid":10,"first_pid":1,"good_standard":"1.46mg/L",
    2019-09-29

最新評論

亿宝娱乐黑钱