java內部類

內部類的編譯解釋

在這裏插入圖片描述

  1. Java源程序要遵循Java語言規範,Java編譯器按照Java語言規範來編譯源程序。
  2. 字節碼程序要遵循字節碼語言規範,JVM的Java解釋器/JIT編譯器按照字節碼規範來解釋/編譯運行字節碼程序。
  3. Java語言與字節碼語言是兩種不同的語言。它們的語言規範有相同處,也存在不同的地方。
    例如:
    相同處:均有訪問控制符。一個類內部的私有成員只能被該類的其他成員所訪問,其他類無法訪問該類的私有成員。
    不同處:1)內部類是Java語言的規範,字節碼規範中無內部類指令,JVM對內部類一無所知。
    2)在Java語言規範中一個類不予許定義函數簽名完全相同的兩個方法,與返回類型無關。在字節碼規範中一個類中允許定義函數簽名完全相同而返回類型不同的兩個方法。
  4. Java編譯器
    打個比方,Java語言如同中文,字節碼語言如同英文,Java編譯器如同一個翻譯。這個翻譯,不僅要把符合中文語言規範的中文翻譯成符合英文語言規範的英文(這個翻譯是知道中文語法和英文語法差異的),而且翻譯出來的英文在意思上和中文在意思上應該完全相同。
    1)按照Java語言規範編譯Java源程序
    2)生成的字節碼程序必須滿足字節碼語言規範
    3)生成的字節碼程序必須嚴格完成Java源程序的功能和安全

**由於字節碼規範中無內部類指令,內部類是Java語言的規範。所以,Java編譯器既要按照內部類的Java語法來編譯源程序,又要按照無內部類的字節碼語法來生成字節碼程序,同時生成的無內部類的字節碼程序要完成有內部類的源程序的功能。**所以,編譯器是意譯,而不是直譯。

**注:**一定要記住,運行的程序是字節碼程序,而不是Java源程序,內存模型是JVM虛擬機運行字節碼的結果。程序員一定要編寫出符合Java語言規範的高質量可維護的、可擴展的源程序,對字節碼和內存模型的理解,可以加深程序員對Java編譯器、Java解釋器,特別是對Java源程序的理解。即加深對源程序的運行過程,過程的深度和細節的理解,,更好的完成源程序的功能和安全。

什麼叫內部類

在Java語言中,內部類是指在一個外部類的內部再定義一個類。內部類可以是靜態static的,也可用public,default,protected和private修飾(而外部頂級類只能使用public和default,外部頂級類無靜態static)。而在字節碼語言中,只有類的概念,沒有外部類和內部類的概念,類只能使用public和default進行訪問控制。

注意: 內部類是一個編譯器現象,JVM虛擬機並不知道內部類與常規類有什麼不同。對於源文件中一個名爲Outer的外部類和其內部定義的名爲Inner的內部類,編譯成功後會出現Outer.class和OuterInner.classOuterOuterInner.class兩個字節碼文件以及文件中的Outer和OuterInner兩個類,編譯器將會把內部類翻譯成用()Outer(美元符號)分隔外部類名與內部類名的獨立的常規類名,而虛擬機則對此一無所知,虛擬機在運行時,也是把OuterInner作爲一種常規類來處理的。所以內部類的成員變量/方法名可以和外部類的相同

Java內部類語法描述的是內部類和外部類的關係,而與外部類的父類無關(因爲編譯器生成的字節碼程序必須嚴格按照Java源程序的功能和安全,要修改外部類,而外部類的父類可能是第三方類,是無法修改的)

使用外部類的主要原因

  1. 內部類一般只爲其外部類使用。
  2. 內部類方法可以訪問該內部類定義所在的外部類的數據,包括私有數據。內部類提供了某種進入外部類的窗戶。
  3. (安全)訪問控制:內部類可以對同一個包中的其他類隱藏起來。
  4. 命名控制:儘管內部類重名,但是它們的外部類不重名,它們編譯後的類名是一個合成名。所以可以避免內部類重名和多義。
  5. 當定義一個事件監聽器和其他回調函數時,可使用匿名內部類。
  6. 最吸引人的原因:每個內部類都能獨立的繼承一個接口,而無論外部類是否已經繼承了該接口。因此,內部類使多重繼承的解決方案變得更加完整。

內部類標識符

每個類都會產生一個.class文件,文件名即爲類名。同樣,內部類也會產生這麼一個.class文件,但是它的名稱卻不是內部類的類名,而是有着嚴格的限制:外圍類的名字加上$再加上內部類名字。

內部類分類

全部的內部類總共有六種:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章