Java中外部類的子類會繼承外部類的成員內部類,成員內部類的簡單說明

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 靜態內部類()訪問靜態內部類的實例。

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