內部類可隨意引用外部類所有成員(含 private 變數/方法),甚至修改其值。外部類 private int i 在內部類中可直接讀寫,此特性打破封裝邊界,屬於內部類特權。
成員內部類實例必須綁定外部類實例。在外部類中以 new InnerClass() 建立內部類物件,內部實例自動綁定當前外部實例。不同於一般類別可延遲實例化,內部類定義時通常即在外部類建構子或欄位初始化時實例化,確保綁定關係。
內部類→外部類:自由存取。
外部類→內部類:不可直接存取內部類成員(變數/方法)。若外部類定義 int i,內部類定義 int ii,內部類可直接用 i=5,但外部類寫 ii=5 編譯錯誤。外部類需透過內部類物件參考存取:innerObj.ii = 5。
實例化語法:外部類非靜態方法外實例化內部類需用 OuterClass.InnerClass obj = outerObj.new InnerClass(),語法繁瑣,建議避免在靜態上下文實例化。內部類物件強依賴外部類物件,無外部實例無內部實例。
外部類與內部類可定義同名變數(如皆為 i)。內部類中:
this.i → 內部類自身的 iOuterClass.this.i → 外部類的 i建議:除非極特殊需求,否則避免同名變數,否則增加閱讀與維護負擔。
OuterClass.this.member 消除歧義