欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

Java中靜態內部類和非靜態內部類有什么區別?

李中冰2年前14瀏覽0評論

在介紹區別之前,首先把概念理一下,Java允許在一個類中定義另一個類,這樣的類被稱為嵌套類,而嵌套類又可分為四種:

  • 靜態嵌套類-聲明為另一個類的靜態成員

  • 內部類-聲明為另一個類的實例成員

  • 本地內部類-聲明在一個類的實例方法中

  • 匿名內部類-類似本地內部類,但它是表達式,定義并返回一個只使用一次的對象

具體的用法,可以查看Oracle提供的JavaTutorial中的[ClassesandObjects]這一節,這里就不在寫了,下面看下各種嵌套類的特點和區別。

靜態嵌套類


  • 與類方法和字段一樣,與外部類相關聯

  • 無法直接訪問外部類的實例方法或字段

  • 除了位于外部類的命名空間中,在行為上與普通頂級類無異

  • 它更多的目的是為了方便打包

內部類


  • 與實例方法和字段一樣,與外部類的實例相關聯

  • 可以直接訪問該實例的私有方法和字段

  • 無法定義自己的任何靜態成員

  • 不能聲明interface,因為接口本質是靜態的

本地內部類


  • 它是在塊中定義的類,塊就是使用成對的大括號組成語句,比如for循環

  • 類似內部類,非靜態,可訪問外部類的私有成員

  • 此外可訪問局部變量和參數,但它們必須為final類型

  • 可以聲明靜態的常量變量

匿名內部類


  • 主要提供更簡潔和方便的代碼來使用本地內部類,在聲明一個類的同時并實例化

  • 與本地內部類類似,可訪問final類型的局部變量

  • 與內部類類似,可訪問外部類的私有成員

  • 不能聲明構造函數,但可以聲明一個用于初始的

  • 此外可以聲明字段、額外的方法和本地類


為什么使用嵌套類

使用嵌套類大概有三個原因:

  • 邏輯分組-如果一個類只對另一個類有用,尤其是它不會在任何其他類中使用時,使用嵌套類是將兩者是最合邏輯的。還能簡化包結構,不必再新建一個文件

  • 增強封裝-有兩個頂級類A和B,其中B需要訪問A中聲明為private的成員,就可以通過將B嵌套在類A中實現,此外對于外面的世界B是隱藏的

  • 代碼更易讀和可維護-嵌套使得代碼更接近使用它的位置,帶來更易讀和可維護的代碼

何時使用嵌套類、本地類、匿名類

當類只用于外部類并且它獨立于外部類的(私有)成員時,使用靜態嵌套類;如果需要訪問外部類的私有成員時,則使用非靜態嵌套類,即內部類。

比如,LinkedList<E>的Node<E>嵌套類,它既不需要被外面的類訪問,又不需要訪問外部類的成員,所以它被聲明成了靜態嵌套類;而其中的ListItr迭代器實現類,它需要訪問LinkedList內部受限的成員,所以聲明成了內部類。

本地內部類,可以看作是Java提供的閉包,而匿名內部類可以看作是更方便的創建和使用本地內部類的方法,通常將其當作方法參數,用于回調。

常見與GUI編程中,比如,在監聽窗口關閉事件時,會這樣寫addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){TODO}});

以上就是我的理解,可能有誤,歡迎評論區交流,指正啊~

持續分享Java源碼分析,造造輪子的文章以及對編程、架構等方面的看法,交流-「頓悟源碼」