1. 程式人生 > >java核心技術_6.1介面6.2介面示例

java核心技術_6.1介面6.2介面示例

介面中的所有方法自動地屬於public,不必提供關鍵字public.介面中絕不能含有例項域.在java8中,介面可以提供簡單的實現方法了,這些方法不能引用例項.

儘管不能構造介面的物件,卻能宣告介面的變數:  Comparable x;    介面變數必須引用實現了介面的類物件: x= new Employ(...)     也可以使用instanceof檢查一個物件是否實現了某個特定的介面.     介面也可以被擴充套件    public interface Power extends Moveable {}     介面中不能包含例項域或靜態方法,但卻可以包含常量  介面中的域將被自動地設為public static final          儘管每個類只能夠擁有一個超類,但卻可以實現多個介面

在java se8中允許在介面中增加靜態方法.      也可以為介面方法提供一個預設實現.必須用default修飾符標記這樣一個方法

public interface Comparable<T> {
    default int compareTo(T other) { return 0; }
}

雖然這樣似乎沒太大用處,因為Comparable的每一個實際實現都要覆蓋這個方法。但是在某些情況下,預設方法可能很有用。當被實現的介面中有些方法是一些其他實現類並不需要的時候,可以將這些方法設定為default,這些預設方法什麼都不做,其實現類卻不需要必須覆蓋這些方法了

1.解決預設方法衝突

     a.超類優先。如果超類提供了一個具體方法,同名而且有相同引數型別的預設方法會被忽略

     b.介面衝突。如果一個超介面提供了一個預設方法,另一個提供了一個同名而且引數型別(不論是否是預設引數)相同的方法,必須覆蓋這個方法來解決衝突。

兩個介面如何衝突並不重要。如果至少有一個介面提供了一個實現,編譯器就會報告錯誤,而程式設計師就必須解決這個二義性。

如果兩個介面都沒有為共享方法提供預設實現,實現類可以有兩個選擇:實現這個方法,或者乾脆不實現。如果是後一種情況,這個類本身就是抽象的。

2.物件克隆

當為一個包含物件引用的變數建立副本時,原變數和副本都是同一個物件的引用,任何一個變數改變都會影響另一個變數。    如果希望一個新物件的初識狀態與original相同,但是之後它們各自會有自己不同的狀態,這種情況下就可以使用clone方法。

預設的克隆操作是“淺拷貝”,並沒有克隆物件中引用的其他物件。如果原物件和淺克隆物件共享的子物件是不可變的,那麼這種共享就是安全的。不過,通常子物件都是可變的,必須重新定義clone方法來建立一個深拷貝,同時克隆所有子物件。

對於每一個類,需要確定:   a.預設的clone方法是否滿足要求             b.是否可以在可變的子物件上呼叫clone來修補預設的clone方法   c.是否不該使用clone               實際上第3個選項是預設選項。如果選擇第1項或第2項,類必須:          1)實現Cloneable介面          2)重新定義clone方法,並指定public訪問修飾符。

建立深拷貝的clone方法的一個例子
class Employee implements Cloneable {
    ....
    public Employee clone() throws CloneNotSupportedException {
        //call Object.clone()
        Employee cloned = (Empolyee) super.clone();

        //clone mutable fields
        cloned.hireDay = (Date) hireDay.clone();

        return cloned;
    }
}

如果在一個物件上呼叫clone,但這個物件的類並沒有實現Cloneable介面,Object類的clone方法就會丟擲一個CloneNotSuppertedException。