接口
1、在Java程序設計語言中,接口不是類,而是對類的一組需求描述,這些類要遵從接口描述的統一格式進行定義。
2、接口中的所有方法自動地屬於public。
3、接口絕對不能含有實例域,也不能在接口中實現方法。提供實例域和方法實現的任務應該由實現接口的那個類來完成。
4、使用implements關鍵字使類實現一個接口。
5、接口不是類,尤其不能使用new運算符實例化一個接口:
x = new Comparable(...) // ERROR
6、然而,儘管不能構造接口的對象,卻能聲明接口的變量:
Comparable x; // OK
7、可以使用instanceof檢查一個對象是否實現了某個接口。
8、類似於建立類的繼承關係,接口也可以被擴展。允許存在多條從具有較高通用性的接口到較高專用性的接口的鏈:
public interface Movable {
void move(double x, double y);
}
public interface Powered extends Moveable {
double milesPerGallon();
}
9、在接口中可以包含常量,接口中的域會被自動設置爲public static final。
public interface Powered extends Moveable {
double milesPerGallon();
double SPEED_LIMIT = 95; // a public static final constant.
}
10、每個類只能有一個超類,但是可以實現多個接口。
11、接口可以提供多重集成的大多數好處,同時還能避免多重集成的複雜性和低效性。
12、Java默認的克隆操作時淺拷貝,它並沒有克隆包含在對象中的內部對象。
13、進行對象克隆操作時,需要作出下列判斷:
① 默認的clone方法能否滿足需求。
② 默認的clone方法是否能夠通過調用可變子對象的clone得到修補。
③ 是否不應該使用clone。
如果要選擇①和②,類必須:
① 實現Cloneable接口。
② 使用public訪問修飾符重新定義clone方法。
14、Cloneable是一個標記接口(tagging interface),接口中不包含方法,使用它的唯一目的是可以用instanceof進行類型檢查。
15、所有的數組類型均包含一個clone方法,這個方法被設爲public,而不是protected。可以利用這個方法創建一個包含所有數據元素的拷貝的新數組:
int[] luckyNumbers = {2, 3, 5, 7, 11, 13};
int[] cloned = luckNumbers.clone();
cloned[5] = 12; // doesn’t change luckyNumbers[5];
內部類
1、內部類(inner class)是定義在另一個類中的類。
2、定義內部類主要基於以下三個原因:
① 內部類方法可以訪問該類定義所在的作用域中的數據,包括私有數據
② 內部類可以對同一個包中的其他類隱藏起來。
③ 當想要定義一個回調函數且不想編寫大量的代碼時,使用匿名內部類比較便捷。
3、內部類既可以訪問自身的數據域,也可以訪問創建它的外圍類的對象的數據域。
4、內部類中可以使用外圍類的引用,表達式OuterClass.this表示外圍類的引用。
5、在外圍類的作用域之外,可以這樣引用內部類:OuterClass.InnerClass。
new OuterClass().new InnerClass();
6、可以在方法內部定義局部類,局部類不能用public或private訪問說明符進行聲明。它的作用域被限定在這個局部類的塊中。
7、局部類可以訪問final修飾的局部變量。
8、定義匿名內部類:
new SuperType(construction parameters) {
inner class and data;
}
9、匿名類不能有構造器,取而代之的是,將構造器參數傳遞給超類構造器。尤其是內部類實現接口的時候,不能有任何構造參數:
new InterfaceType() {
methods and data;
}
10、雙括號初始化:
new ArrayList<String>() {
{
add(“Harry”);
add(“Tony”);
}
11、有時候,使用內部類知識爲了把一個類隱藏在另外一個類的內部,並不需要內部來引用外圍類對象。爲此,可以將內部類聲明爲static,一遍取消產生的引用,這樣就定義了一個靜態內部類。