package com.it.study;
public class TestMemberInnerClass {
public static void main(String[] args) {
Outer.UnstaticInnerClass varName = new Outer().new UnstaticInnerClass();
varName.show();
Outer out = new Outer();
Outer.UnstaticInnerClass unsi = out.new UnstaticInnerClass();
unsi.show();
Outer.StaticInnerClass varName2 = new Outer.StaticInnerClass();
System.out.println(varName2.age);
System.out.println(varName2.staticPropIner);
System.out.println(Outer.StaticInnerClass.staticPropIner);
varName2.show();
// Outer.StaticInnerClass si = new Outer().new Outer.StaticInnerClass();//當被封閉實例限定時,無法使用其複合名稱分配成員類型Outer.StaticInnerClass。成員類型名稱相對於限定實例類型進行解析
OuterChild otc = new OuterChild();
OuterChild.UnstaticInnerClass unsi2 = otc.new UnstaticInnerClass();
OuterChild.StaticInnerClass varName3 = new OuterChild.StaticInnerClass();
}
}
class OuterChild extends Outer{
}
class Outer{
private int age = 10;
private int outerProp = 10;
public static int staticProp = 10;
public void OuterSelfMethod() {
System.out.println(this.new UnstaticInnerClass().age);
}
public static void OuterStaticSelfMethod() {
System.out.println(Outer.StaticInnerClass.staticPropIner);
}
class UnstaticInnerClass{
int age = 20;
public void show() {
int age = 30;
System.out.println("內部類方法裏的局部變量age:" + age);// 30
System.out.println("內部類的成員變量age:" + this.age);// 20
System.out.println("外部類的成員變量age:" + Outer.this.age);// 10
System.out.println("外部類的成員變量outerProp:" + outerProp);
new Outer().OuterSelfMethod();
}
}
static class StaticInnerClass{
int age = 10;
static int staticPropIner = 10;
public void show() {
int age = 30;
System.out.println("內部類方法裏的局部變量age:" + age);// 30
System.out.println("內部類的成員變量age:" + this.age);// 20
// System.out.println("外部類的成員變量age:" + Outer.this.age);// 10
// System.out.println("外部類的成員變量outerProp:" + outerProp);
System.out.println("外部類的成員變量staticProp:" + Outer.staticProp);// 10
System.out.println("外部類的成員變量staticProp:" + staticProp);
// OuterSelfMethod();
Outer.OuterStaticSelfMethod();
}
}
}
可以用private、default、protected、public進行修飾(就和普通成員一樣),類文件:外部類$內部類.class
1、 非靜態內部類(外部類裏使用非靜態內部類和平時使用其他類一樣)
a) 非靜態內部類必須寄存在一個外部類對象裏。故而非靜態內部類對象一定有個外部類對象存在。非靜態內部類對象單獨屬於某個外部類對象(封裝,類似某人自己的心臟)
b) 非靜態內部類可以直接訪問外部類成員,但外部類成員不可以訪問非靜態內部類成員。
c) 非靜態內部類不可以有靜態方法、靜態屬性和靜態初始化塊。(因爲是類的非靜態成員)
d) 外部類的靜態方法,靜態代碼塊,不可以訪問靜非態內部類,包括不可以用它定義變量和創建實例。
e) 成員變量的訪問:
i. 內部類方法的局部變量:變量名
ii. 內部類屬性:this.變量名。
iii. 外部類屬性:外部類名.this.變量名(如果這個屬性只有外部類有,也可以直接用)
f) 內部類的訪問:
i. 外部類中定義內部類:new Inner();
ii. 外部類以外的地方使用非靜態內部類:Outer.Inner varnme = new Outer().newInner();
2、 靜態內部類
a) 定義方式:
static class ClassName{//類體}
b) 使用要點:
i. 當一個靜態內部類對象存在,並不一定存在對應的外部類對象。因此,靜態內部類的實例方法不能直接訪問外部類的實例方法。(靜態內部類是類的靜態成員)
ii. 靜態內部類看作外部類的一個靜態成員。因此外部類的方法中可以通過:“靜態內部類.名字”的方式訪問靜態內部類的靜態成員,通過new 靜態內部類()訪問靜態內部類的實例。