Java4Android自學記錄(23):內部類和匿名內部類

道阻且長,行則將至。埋頭苦幹,不鳴則已,一鳴驚人!加油,騷年!

目錄及資源索引

  Java4Android自學過程目錄及資源索引

1 什麼是內部類?

  內部類:一個類定義在另一個類的裏邊,就把這種類稱爲內部類;代碼舉例如下:

class A
{
    class B
    {
        
	}
}

  此時如果直接編譯,編譯結果會是什麼樣呢?編譯出來會有 2 個 class 文件,如下圖:
image-20200526224829631

  其中 A$B.class 就是內部類生成的類文件;

  內部類編譯後的名字,就是:外部類名$內部類名.class

2 內部類有哪些語法特徵?

2.1 如何生成內部類對象?

  還是使用上述類文件,此時再重新創建一個類,用來存放 main 函數,程序內容如下:

class Test
{
	public static void main(String args[]) 
	{
		A a = new A();				// 生成類A 對象
		
		A.B b = new A().new B();	// 生成子類B 對象
	}
}

2.2 內部類成員變量/函數的使用方法

  我們先修改第一節的類文件,在其中添加部分成員變量,用以測試,具體代碼如下:

class A 
{
	int i;
	
	class B 
	{
		int j;
		
		int funB()
		{
			int result = i + j;
			System.out.println(result);		// 添加result打印,調試用
			return result;
		}
	}
}

  此時再修改 main 函數,分別給類 A,類 B 中的成員變量賦值,查看函數輸出結果

class Test
{
	public static void main(String args[]) 
	{
		A a = new A();				// 生成類A 對象
		
		A.B b = a.new B();			// 生成子類B 對象
		
		a.i = 3;
		b.j = 1;
		b.funB();
	}
}

  上述代碼,編譯運行後,結果如下:
image-20200526230400661

  由代碼及運行結果分析可得:

  • 內部類可以隨意使用外部類定義的成員變量。
  • B 是 A 的內部類,意味着在B當中可以隨意使用 A 當中的成員變量和成員函數,但是這不意味着 B 繼承了 A,只是能使用而已,但是 B 並不擁有這些成員變量。
  • 每一個內部類的對象都和一個外部類的對象相關聯。也就是說有內部類對象,必然有一個跟他關聯的外部類對象。
  • 實際在內部類 B 中使用的變量 i ,就是外部類中的成員變量。

3 匿名內部類

  匿名內部類:首先是內部類,其次沒有名字,就叫匿名內部類;

  下邊用具體的代碼進行實現,新建一個接口類 A

interface A 
{
	public void doSomething();
}

  接着定義一個類 B

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

  此時類 B 需要一個 A 類型的對象,作爲參數,還需要一個接口 A 的子類,因爲 A 不能直接生成對象,具體如下:

class AImpl implements A 
{
	public void doSomething()
	{
		System.out.println("doSomething");
	}
}

  此時對主函數稍作修改,具體代碼如下:

class Test
{
	public static void main(String args[]) 
	{
		AImpl al = new AImpl();	// 生成子類對象
		A a = al;				// 向上轉型
		
		B b = new B();
		b.fun(a);				// 傳進去類型爲A的參數
	}
}

  上述代碼編譯運行結果如下:
image-20200526232124996

  注意,如果此時使用匿名內部類,就會有一個不太正常的寫法,修改主函數代碼如下:

class Test
{
	public static void main(String args[]) 
	{
		// AImpl al = new AImpl();	// 生成子類對象
		// A a = al;				// 向上轉型
		
		B b = new B();
		b.fun(new A()
			{
				public void doSomething()
				{
					System.out.println("匿名內部類");
				}
			}
		);
	}
}

  上述代碼重新編譯後,運行結果如下圖:

  對匿名內部類代碼及編譯結果進行分析如下:

  • 類B 的 fun 函數需要一個 A 類型的對象,和之前那個 AImpl 基本類似,但是沒有名字;
  • new A() 不能直接用,後邊必須要跟上實現接口的類,但是沒有名字,就叫匿名類;

4 總結

  1. 瞭解內部類,內部類的基本語法特徵,實現方式等;
  2. 瞭解內部類成員變量、成員函數的使用方法,作用範圍等;
  3. 簡單瞭解匿名內部類,特徵及實現方式等。

如果文章內容有誤,麻煩評論/私信多多指教,謝謝!如果覺得文章內容還不錯,留個讚唄,您的點贊就是對我最大的鼓勵,謝謝您嘞!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章