Java(和其餘語言)經過內部類支持嵌套類。要使其正常工做,須要編譯器執行一些技巧。這是一個例子:java
public class Outer {
private int outerInt;
class Inner {
public void printOuterInt() {
System.out.println("Outer int = " + outerInt);
}
}
}
複製代碼
在執行編譯以前,編譯器會修改它以建立相似的東西:spa
public class Outer {
private int outerInt;
public int access$000() {
return outerInt;
}
}
class Inner$Outer {
Outer outer;
public void printOuterInt() {
System.out.println("Outer int = " + outer.access$000());
}
}
複製代碼
雖然從邏輯上講,內部類是與外部類相同的代碼實體的一部分,但它被編譯爲一個單獨的類。所以,它須要編譯器建立合成橋接方法,以提供對外部類的私有字段的訪問。code
這個JEP引入了巢的概念,其中同一巢的兩個成員(咱們的例子中的外部和內部)是同窩。爲類文件格式NestHost和NestMembers定義了兩個新屬性。這些更改對於支持嵌套類並編譯爲字節碼的其餘語言很是有用。get
此功能爲java.lang.Class引入了三個新方法:編譯器
此功能還須要更改Java虛擬機規範(JVMS),特別是第5.4.4節「訪問控制」。虛擬機