顧名思義,就是有個Class包在另一個Class裡面

一般內部類別 (成員內部類別 )Member inner class
基本上是在一個類別中直接宣告另一個類別

package innerclassDemo;
//一般內部類別
class classDemo{
	class innerclass{//類別裡面在創造一個innerclass內部類別
		void amethod() {//內部類別裡面的amethod
			System.out.println("innerclass");
		}
	}
}
public class innerclassDemo {

	public static void main(String[] args) {
		classDemo a =new classDemo();
		classDemo.innerclass a1 = a.new innerclass();
		a1.amethod();
		new classDemo().new innerclass().amethod();//奏另一條 完整地宣告路徑
	}
}

 匿名內部類別 Anonymous inner class

內部匿名類別可以不宣告類別名稱,而使用 “new” 直接產生一個物件,內部匿名類別可以是繼承某個類別或是實作某個介面

package innerclassDemo;
//匿名內部類別Anonymous inner class
public class innerclassDemo2 {
	public static void main(String[] args) {
		int a=10;
		
		(new Object() { //匿名內部類別,直接把要執行的函式放在()內,然後這個類別沒有取名,字首要大寫!
			int b=1000; //匿名類別的成員
			public void amethod() {//匿名類別的方法
				System.out.println("匿名類別");
				System.out.println("this b="+b);
				System.out.println("public main() a="+a);
			}
		}).amethod();//直接執行類別裡面的方法
		
		
	}
}

方法內部類別(區域內部類別 )Local inner class

package innerclassDemo;
//方法內部類別 區域內部類別
public class innerclassDemo3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new innerclassDemo3().aMethod();//創造一個aMethod
	}
void aMethod() {//方法 在方法裡面的東西只有在方法裡面可以使用,class也是 離開方法就沒有用處
	int x=100; //設定一個值
	class innerclass{//方法內部的類別
		void bMethod() {
			System.out.println("Method InnerClass");
			System.out.println("x="+x);//x到類別方法內還可以使用第10行的值
		}
	}
	innerclass i=new innerclass();//使用這個Method方法裡面的類Class別
	i.bMethod();
}

}

靜態內部類別 (靜態巢狀類別)static Nested class

就是在class內有static class
內部類別加上static修飾字就是靜態巢狀類別了
概念上比較像是static import

簡單來說內部類別加上static後就可以直接拜訪到
不需要先實體化外部類別, 就可以直接實體化該類別
就好像把該類別拉到最上層的層級一樣

靜態外部類別的內部類別同樣是被放在Global記憶體區塊,
所以內部類別不管有沒有宣告static,都可互相看見而存取 。

靜態類別本身是沒有this指標,也不需要new建立實體
但靜態內部類別的non-static成員會有this指標指向自己,
因此,也可用new來建立靜態內部類別的實體

package innerclassDemo;
//靜態內部類別
class StaticDemo{

static class Innerstaticclass{//靜態內部類別是已經被配置在GloBal的
	public void aMethod() {
		System.out.println("aMethod!");
	}
	public static void bMethod() {
		System.out.println("bMethod!");
	}
}

}

public class innerclassDemo4 {

	public static void main(String[] args) {

		StaticDemo.Innerstaticclass t =new StaticDemo.Innerstaticclass();
		t.aMethod();
		t.bMethod();
		StaticDemo.Innerstaticclass.bMethod();//靜態內部內別的完整呼叫方式

	}

}

發佈留言