1. 程式人生 > >內部類和匿名內部類

內部類和匿名內部類

A.java
interface  A 
{
	public void doSomething();
}

AImpl.java

class AImpl implements A
{
	public void doSomething()
	{
		System.out.println("doSomething");
	}
}
B.java
class B 
{
	public void fun(A a)
	{
		System.out.println("B類的fun函式");
		a.doSomething();
	}
}


Test.java
class Test 
{
	public static void main(String[] args) 
	{
		//AImpl al = new AImpl();
		//A a = al;

		B b = new B();
		//b.fun(a);
		b.fun(new A()
		{
			public void doSomething()
			{
				System.out.print("匿名內部類");
			}
		});


	}
}

A.java

class A 
{
	int i;

	class B
	{
		int j;

		int funB()
		{
			int result = A.this.i + this.j;
			return result;
		}
	}
}


Test.java
class Test 
{
	public static void main(String[] args) 
	{
		A a = new A();
		//A.B b = new A().new B();
		A.B b = a.new B();

		a.i = 3;
		b.j = 1;
		int result = b.funB();
		System.out.println(result);
	}
}


匿名內部類也就是沒有名字的內部類;

正因為沒有名字,所以匿名內部類只能使用一次,它通常用來簡化程式碼編寫;
但使用匿名內部類還有個前提條件:必須繼承一個父類或實現一個介面;


為什麼需要內部類?
java內部類有什麼好處?為什麼需要內部類?
    首先舉一個簡單的例子,如果你想實現一個介面,但是這個介面中的一個方法和你構想的這個類中的一個方法的名稱,引數相同,你應該怎麼辦?這時候,你 可以建一個內部類實現這個介面。由於內部類對外部類的所有內容都是可訪問的,所以這樣做可以完成所有你直接實現這個介面的功能。
    不過你可能要質疑,更改一下方法的不就行了嗎?
    的確,以此作為設計內部類的理由,實在沒有說服力。
    真正的原因是這樣的,java中的內部類和介面加在一起,可以的解決常被C++程式設計師抱怨java中存在的一個問題——沒有多繼承。實際上,C++的多繼承設計起來很複雜,而java通過內部類加上介面,可以很好的實現多繼承的效果。