1. 程式人生 > >小柒sy的程式設計師成長道路

小柒sy的程式設計師成長道路

內部類

可以將一個類的定義放在另一個類的定義內部,這就是內部類。

class A{
	class B{}
}
  1. 普通內部類
  2. 靜態內部類
  3. 匿名內部類
  4. 區域性內部類

如果想從外部類的非靜態方法之外的任意位置建立某個內部類的物件,那麼必須像在main方法中那樣,具體指明這個物件的型別:OuterClassName.InnerClassName。

連結到外部類

內部類擁有其外圍類的所有元素的訪問權

使用.this和.new

如果你需要生成外部類物件的引用,可以使用外部類的名字後面緊跟.this。 在擁有外部類物件之前是不可能建立內部類物件(除了巢狀類)的,這是因為內部類物件會暗暗地連線到建立它的外部類的物件上。外部物件名.new 內部類名。

在方法和作用域內的內部類

在一個方法或任意的作用域內定義內部類。 在方法中定義類,稱為區域性內部類,區域性內部類沒有訪問許可權修飾符,因為它在方法裡面。 而在任意作用域類定義類,在這個作用域外,它不可被訪問。

匿名內部類

public class LocalInnerClass {
	private int count = 0;
	Counter getCounter1(String name) {
		class LocalCounter implements Counter{//區域性內部類
			public LocalCounter() {
				System.out.println("LocalCounter constructer");
			}
			public int next() {
				System.out.println(name);
				return count++;
			}
		}
		return new LocalCounter();
	}
	Counter getCounter2(String name) {//匿名內部類
		return new Counter() {
			{System.out.println("anonymous constructer");}
			public int next() {
				System.out.println(name);
				return count++;
			}
		};
	}
	public static void main(String[] args) {
		LocalInnerClass localInnerClass = new LocalInnerClass();
		Counter c1 = localInnerClass.getCounter1("oh my god!");
		Counter c2 = localInnerClass.getCounter2("ollllll");
		for(int i=0;i<5;i++)
			System.out.println(c1.next());
		for(int i=0;i<5;i++)
			System.out.println(c2.next());
	}
}

interface Counter{
	int next();
}

介面中的元素預設是public,而且介面中的class自動是static

內部類的繼承

因為內部類的構造器必須連線到指向其外圍類物件的引用,所以在繼承內部類的時候,事情會變得有點複雜。p212

內部類可以被覆蓋嗎

當一個外圍類A有一個內部類C,而這個外圍類被另一個類B繼承時,並且B中有個以C同名的D類,但C沒有被覆蓋;D可以繼承C然後將C中的方法覆蓋。

內部類識別符號 參考p215(Java程式設計思想)