1. 程式人生 > >Java之區域性內部類和匿名內部類的區別詳解(附原始碼)

Java之區域性內部類和匿名內部類的區別詳解(附原始碼)

前言

       前面提到過,可以在程式碼塊裡建立內部類,典型的方式是在一個方法體裡面建立。區域性內部類不能有訪問說明符,因為它不是外圍類的一部分;但是他可以訪問當前程式碼塊內的常量,以及此外圍類的所有成員。下面的例子對區域性內部類與匿名內部類的建立進行了比較。

示例原始碼

package com.mufeng.thetenthchapter;

interface Counter {
	int next();
}

public class LocalInnerClass {
	private int count = 0;

	Counter getCounter(final String name) {
		class LocalCounter implements Counter {

			public LocalCounter() {
				// TODO Auto-generated constructor stub
				// Local inner class can have a constructor
				System.out.println("LocalCounter()");
			}

			@Override
			public int next() {
				// TODO Auto-generated method stub
				System.out.print(name);
				return count++;
			}

		}

		return new LocalCounter();
	}

	Counter getCounter2(final String name) {
		return new Counter() {
			// Anonymous inner class cannot have named constructor,only an
			// instance initializer
			{
				System.out.println("Counter()");
			}

			@Override
			public int next() {
				// TODO Auto-generated method stub
				System.out.print(name);
				return count++;
			}

		};
	}

	public static void main(String[] args) {
		LocalInnerClass lic = new LocalInnerClass();

		Counter c1 = lic.getCounter("Local inner "), 
				c2 = lic.getCounter2("Anonymous inner ");
		for (int i = 0; i < 5; i++) {
			System.out.println(c1.next());
		}

		for (int i = 0; i < 5; i++) {
			System.out.println(c2.next());
		}
	}
}

輸出結果

LocalCounter()
Counter()
Local inner 0
Local inner 1
Local inner 2
Local inner 3
Local inner 4
Anonymous inner 5
Anonymous inner 6
Anonymous inner 7
Anonymous inner 8
Anonymous inner 9

原始碼解析

       Counter返回的是序列中的下一個值。我們分別使用區域性內部類和匿名內部類實現了這個功能,它們具有相同的行為和能力。既然區域性內部類的名字在方法外是不可見的,那為什麼我們仍然使用區域性內部類而不是匿名內部類呢?唯一的理由是,我們需要一個已命名的構造器,或者需要過載構造器,而匿名內部類只能用於例項初始化。        所以使用區域性內部類而不使用匿名內部類的另一個理由就是,需要不止一個該內部類的物件。