1. 程式人生 > >第6章 接 口 、lambda 表示式與內部類

第6章 接 口 、lambda 表示式與內部類

1、警告 : 在介面宣告中, 沒有將 compareTo 方法宣告為 public ,
這是因為在介面中的所有方法都自動地是 public。 不過 , 在實現介面時 ,必須把方法宣告為 pubHc ; 否則 , 編譯器將認為這個方法的訪問屬性是包可見性 , 即類的預設訪問屬性, 之後編譯器就會給出試圖提供更嚴格的訪問許可權的警告資訊。

2、提示 : Comparable 介面中的 compareTo 方法將返回一個整型數值 。 如果兩個物件不相等 ,則返回一個正值或者一個負值。 在對兩個整數域進行比較時 , 這點非常有用 。 例如 , 假設每個僱員都有一個唯一整數 id, 並希望根據ID 對僱員進行重新排序, 那麼就可以返回id - other . idc 如果第一個 ID 小於另一個 ID , 則返回一個負值 ; 如果兩個 ID 相等 , 則返回0 ; 否則 , 返回一個正值。 但有一點需要注意 :整數的範圍不能過大 , 以避免造成減法運算的溢位 。 如果能夠確信 ID 為非負整數 , 或者它們的絕對值不會超過 ( Integer _ MAX _VALUE - 1 ) / 2 , 就不會出現問題。 否則 , 呼叫靜態Integer . compare 方法。

3、當然, 這裡的相減技巧不適用於浮點值 。因為在 salary 和 other . salary 很接近但又不相等的時候 , 它們的差經過四捨五入後有可能變成 0。 x< y 時, Double . compare ( x , y ) 呼叫會返回 - 1 ; 如果 x > y 則返回 1。

4、Comparable相關API:

java . lang . Comparable < T > 1.0
• int compareTo ( T other )
用這個物件與 other 進行比較。 如果這個物件小於other 則返回負值 ; 如果相等則返回0 ; 否則返回正值。

java . util . Arrays 1.2
static void sort ( Object [ ] a )
使用 mergesort 演算法對陣列 a 中的元素進行排序。 要求陣列中的元素必須屬於實現了Comparable 介面的類 , 並且元素之間必須是可比較的 。

 java . lang . lnteger 1.0
•static int comparednt x , int y ) 7
如果 x < y 返回一個負整數 ; 如果 x 和 y 相等, 則返回0 ; 否則返回一個負整數。

java . lang . Double 1.0
•static int compare ( double x , double y ) 1.4
如果 x < y 返回一個負數 ; 如果 x 和 y 相等則返回 0 ; 否則返回一個負數

5、類會繼承 Person 和 Named 介面提供的兩個不一致的 getName 方法。 並不是從中選擇一個, Java 編譯器會報告一個錯誤 , 讓程式設計師來解決這個二義性 。 只需要在 Student 類中提供一個 getName 方法
。 在這個方法中 , 可以選擇兩個衝突方法中的一個 。

class Student implements Person , Named
{
public String getName ( ) { return Person . super . getName ( ) ; }
}

6、P216關於繼承過程中comparable可能出現的問題,之後要重點做研究。

7、介面的特性:
介面不是類, 尤其不能使用 new 運算子例項化一個介面 :
x = new Comparable ( . . . ) ; / / ERROR
然而, 儘管不能構造介面的物件 , 卻能宣告介面的變數 :
Comparable x ; // OK
介面變數必須引用實現了介面的類物件 :
x = new Employee ( . . . ) ; / / OK provided Employee implements Comparable

8、**在 Java SE 8 中, 允許在介面中增加靜態方法 。 理論上講 , 沒有任何理由認為這是不合法的。**java SE8 新特性。

9、關於介面衝突:
(1)、超類優先。 如果超類提供了一個具體方法 , 同名而且有相同引數型別的預設方法會被忽略。一個類擴充套件了一個超類 ,同時實現了一個介面, 並從超類和介面繼承了相同的方法 。在這種情況下, 只會考慮超類方法 , 介面的所有預設方法都會被忽略 。
(2)、介面衝突 。 如果一個超介面提供了一個預設方法, 另一個介面提供了一個同名而且引數型別 ( 不論是否是預設引數 ) 相同的方法 , 必須覆蓋這個方法來解決衝突。

10、重中之重,陣列自定義排序:
按照字串長度排序,而不是字典順序。
對一個物件陣列排序, 前提是這些物件是實現了Comparable 介面的類的例項 。例如 , 可以對一個字串陣列排序, 因為 String 類實現了Comparable < String > , 而 且 String . compareTo 方法可以按字典順序比較字串 。現在假設我們希望按長度遞增的順序對字串進行排序, 而不是按字典順序進行排序 。肯定不能讓 String 類用兩種不同的方式實現 compareTo 方法 —更何況, String 類也不應由我們來修改 。要處理這種情況
Array . Sort 方法還有第二個版本 , 有一個數組和一個比較器( comparator )
作為引數 , 比較器是實現了 Comparator 介面的類的例項。

public interface Comparators
{
	int compare ( T first , T second ) ;
}

要按長度比較字串, 可以如下定義一個實現 Comparator < String > 的類 :

class LengthComparator implements Comparator < String >
{
	public int compare ( String first , String second) {
	return first . length() - second . length() ;
	}
}


String [] friends = { " Peter " , " Paul " , " Mary " } ;
Arrays.sort ( friends , new LengthComparator() ) :

儘管 LengthComparator 物件沒有狀態 , 不過還是需要建立這個物件的一個例項 。
我們需要這個例項來呼叫 compare 方法 它不是一個靜態方法。

11、物件克隆之後深入學習。

12 、lambda表示式,內部類,代理之後深入研究。