Java 再學習 模糊的知識 (四)

接口與內部類

1. 有關接口的一些知識點:
  • 接口不是類,不能用 new 運算符實例化一個接口。雖然不能構造接口的對象,但能夠聲明接口的變量,該變量必須引用實現了接口的類對象。
  • 可以使用 instanceof 檢查一個對象是否實現了某個特定的接口。
  • 接口中不能包含實例域或靜態方法,但卻可以包含常量。
  • 接口中的方法都自動地被設置爲 public ,接口中的域則被自動設置爲 public static final 。
2. 有關對象克隆的一些知識點:
  • 當拷貝一個變量時,原始變量與拷貝變量引用同一個對象,這就是說,若該對象可變則對拷貝變量的修改會影響原始變量。
  • 若對象域均爲數值、基本類型或不可變的子對象則進行淺拷貝,二者修改不會相互影響;但若是對象域中存在可變對象則進行淺拷貝後,對二者的修改會相互影響,此時爲了得到互不影響但是狀態在此刻相同的兩個對象應該使用深拷貝
public static void cloneAndCopyTest() {
	//基本類型
	//a= 2 b= 2
	//a= 2 b= 3
	int a = 2;
	int b = a;
	System.out.println("a= "+a+" b= "+b);
	b = 3;
	System.out.println("a= "+a+" b= "+b);
	//不可變對象
	//s1= Good! s2= Good!
	//s1= Good! s2= Study
	String s1 = "Good!";
	String s2 = s1;
	System.out.println("s1= "+s1+" s2= "+s2);
	s2 = "Study";
	System.out.println("s1= "+s1+" s2= "+s2);
	//可變對象
	//d1= Fri Jan 02 00:00:00 CST 3920 d2= Fri Jan 02 00:00:00 CST 3920
	//d1= Thu Sep 02 00:00:00 CST 3920 d2= Thu Sep 02 00:00:00 CST 3920
	Date d1 = new Date(2020, 0, 2);
	Date d2 = d1;
	System.out.println("d1= "+d1+" d2= "+d2);
	d2.setMonth(8);
	System.out.println("d1= "+d1+" d2= "+d2);
	//對可變對象應該使用深拷貝
	//d1= Thu Sep 02 00:00:00 CST 3920 d3= Fri Jan 02 00:00:00 CST 3920
	Date d3 = (Date) d1.clone();
	d3.setMonth(0);
	System.out.println("d1= "+d1+" d3= "+d3);
}
  • 對於每個類,都需要做出下列判斷:
    1)默認的 clone 方法是否滿足要求。
    2)默認的 clone 方法是否能夠通過調用可變子對象的 clone 得到修補。
    3)是否不應該使用 clone。
    實際上,選項3是默認的。如果要選擇1或2,類必須:
    1)實現 Cloneable 接口。
    2)使用 public 訪問修飾符重新定義 clone 方法。
3. 使用內部類的主要原因:
  • 內部類方法可以訪問該類定義所在的作用域中的數據,包括私有的數據。
  • 內部類可以對同一個包中的其他類隱藏起來。
  • 當想要定義一個回調函數且不想編寫大量代碼時,使用匿名(anonymous)內部類比較
    便捷。
4. 可以在一個方法中定義局部類。局部類不能用 public 或 private 訪問說明符進行聲明。它的作用域被限定在聲明這個局部。
5. 局部類的優點:
  • 對外部世界可以完全地隱藏起來。
  • 不僅能夠訪問包含它們的外部類,還可以訪問局部變量。不過,那些局部變量必須被聲明爲 final 。
6. final 關鍵字可以應用於局部變量、實例變量和靜態變量。在所有這些情況下,它們的含義都是:在創建這個變量之後,只能夠爲之賦值一次。此後,再也不能修改它的值了,這就是 final 。定義時沒有初始化的 final 變量通常被稱爲空 final 變量。
7. 有的時候局部類的 final 限制使得程序編寫不太方便,補救的方法是使用一個長度爲1的數組(數組變量仍然被聲明爲 final,但是這僅僅表示不可以讓它引用另外一個數組。數組中的數據元素可以自由地更改。)
8. “雙括號初始化”。假設你想構造一個數組列表,並將它傳遞到一個方法,傳遞後便不再使用這個數組列表則最好讓它作爲一個匿名列表。
//雙括號初始化 [Tom, Tim]
public static void doubleBracket() {
	//外層大括號建立了ArrayList的匿名子類,內層大括號則是一個對象構造塊
	System.out.println(new ArrayList<String>() {{add("Tom");add("Tim");}});
}
9. 靜態內部類:
  • 有時候,使用內部類只是爲了把一個類隱藏在另外一個類的內部,並不需要內部類引用外圍類對象。爲此,可以將內部類聲明爲 static ,以便取消產生的引用。
  • 當然,只有內部類可以聲明爲static。靜態內部類的對象除了沒有對生成它的外圍類對象的引用特權外,與其他所有內部類完全一樣。
  • 聲明在接口中的內部類自動成爲 static 和 public 類。

學習整理自《Java 核心技術 卷一 基礎知識》

發佈了57 篇原創文章 · 獲贊 25 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章