一篇文章瞭解Java內部類

一、實例內部類

需要創建實例去訪問內部類的方法
要創建內部類的實例,需要先創建外部類的實例

class outer{
	public class InnerTool{ //內部類
		public int add(int a,int b){
			return a+b;
		}
	}
	private InnerTool tool=new InnerTool();
	public void add(int a,int b,int c){
		tool.add(tool.add(a,b),c);
	}
}
public void Tester{
	public static void main(String args[]){
		Outer.InnerTool tool=new Outer().new InnerTool();
		//先創建外部類Outer在創建內部類InnerTool
		tool.add(1,2);
	}
}

實例內部類可以直接訪問外部類的所有成員變量以及方法,不管訪問權限。
重名變量的訪問

class Outer {
	public int num = 10;
	class Inner {//內部類
		public int num = 20;
		public void show() {
			int num = 30;
			System.out.println(num);//方法中的num
			System.out.println(this.num);//內部類的num
			System.out.println(Outer.this.num);//外部類的num
		}
	}
}

二、靜態內部類

創建靜態內部類的實例不需要創建外部類的實例
可以通過類名直接訪問靜態內部類的靜態成員,而非靜態成員需要創建實例才能訪問。

class A{
	public static class B{//靜態內部類
		int x;
		static int y;
	}
}
class Tester{
	public void test(){
		A.B b=new A.B();//不需要new A.()
		b.x=1;//實例可訪問非靜態變量
		b.y=1;//實例可訪問靜態變量
		A.B.x=1;//錯誤,必須先實例化A.B
		A.B.y=1;//直接通過類名訪問靜態內部類的靜態變量
	}
}

三、局部內部類

局部內部類是在外部類的方法中的類,只能在當前方法中使用

class A{
	B b=new B();//在方法之外無法訪問局部內部類
	public void method(){
		class B{//局部內部類
			int a;
			int b;
		}
		B b=new B();//在方法內可以訪問局部內部類
	}
}
  • 局部內部類可以訪問外部類所有成員
  • 局部內部類可以訪問當前方法中最終變量或參數

最終變量或參數包括用final修飾的以及在該方法中從初始化開始就沒有被修改過值的變量,也就是實際上的最終變量或者參數

class A{
	int a;
	public void method(final int p1,int p2){
		int localV1=1;
		final int localV2=2;
		int localV3=0;
		localV3=1;
		class B{//局部內部類
			int b1=a;//外部類
			int b2=p1;//final int
			int b3=p2;//沒有被修改過值的參數
			int b4=localV1;//沒有被修改過值的變量
			int b5=localV2;//final int
			int b6=localV3;//localV3被修改成了0
		}
	}
}

四、匿名類

匿名類是沒有名字的內部類
匿名類沒有構造方法,會調用父類的構造方法

public class A{
	void method(){}
	public static void main(String args[]){
		A a=new A(){//匿名類
			//匿名類實例a直接調用A類默認構造方法
			void method(){...}//會override 類A中method方法
		}
	}
}

使用匿名類來重寫接口

interface Inter {
    void show();
}

class Outer {
	public static Inter method() {
		return new Inter() {//匿名類
			public void show() {//重寫接口show
				System.out.println("oo");
			}
		};
	}
}

public class Test {
	public static void main(String[] args) {
		  Outer.method().show();
	  }
}

五、使用內部類的作用

  • 內部類可以封裝方法
  • 在需要用a類修改b類的private類型變量時,可以將a類 作爲b類的內部類
  • 內部類可以回調

什麼叫回調?
一個類儘管實現了某種功能,但是沒有提供響應的接口,客戶類可以通過這個類的內部類的接口來獲得這個功能,在 四、匿名類 中的用匿名類來重寫接口就是一個很好的例子

六、內部類文件命名

對於每個內部類編譯器都會生成獨立的.class文件

  • 成員內部類:外部類的名字$內部類的名字
  • 局部內部類:外部類的名字$數字和內部類的名字
  • 匿名類:外部類的名字$數字
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章