- 自限定型、枚舉Enum<E extends Enum< E >>
- 反射、Class
- 接口中的所有方法自動地屬於public,因此在接口中聲明方法時,不必提供關鍵字public。但是在類中實現接口的時候一定要顯式地將實現的方法聲明爲public
- 接口中不能包含有實例域,但是可以包含常量,並且接口中的域將被自動設爲
public static final
- 接口不是類,所以我們不能實例化一個接口,但是我們可以聲明接口的變量:
Comparable x;
並且接口變量只能夠引用實現了接口的類對象:x=new Employe("Tom",10000);
- 如同使用instanceof來檢查一個對象是否屬於某個特定類一樣,也可以使用instanceof檢查一個對象是否實現了某個特定接口:
if(anObject instance Comparable) {...}
- 接口也可以被拓展,用
extends
關鍵字
- Java中可以多級繼承,但是不存在多重繼承
- 可以爲接口提供一個默認實現,必須用default修飾符標記這樣一個方法
默認方法的一個重要作用是接口演化,假如說庫裏面的某個接口添加了一個方法,但是之前繼承過這個接口的類沒有實現這個接口,那麼就會無法編譯。而我們添加了默認函數就可以避免這種事情,讓舊的代碼兼容新的jdk
//可能我們只需要關注前兩個事件
public interface MouseListener{
default void mouseClicked(MouseEvent event) {}
default void mousePressed(MouseEvent event) {}
default void mouseReleased(MouseEvent event) {}
default void mouseEntered(MouseEvent event) {}
default void mouseExited(MouseEvent event) {}
- 接口衝突:如果先在一個接口中將一個方法定義爲默認方法,然後又在超類或者另一個接口中定義了同樣的方法,就會發生接口衝突,因爲編譯器不知道你要調用的是哪個方法。有兩個原則:
超類優先:如果超類提供了一個具體方法,同名並且有相同參數類型的接口默認方法會被忽略
超接口衝突:如果一個超接口提供了一個默認方法,另一個接口提供了一個同名並且參數類型相同的方法,則必須覆蓋這個方法來解決問題(編譯器會報錯)
我們來看一下第二種
interfce Named{
default String getName(){
return getClass().getName()+"_"+hashCode();
}
class Student implements Person,Named{
//要覆蓋掉
public String getName(){
return Person.super.getName(); //指明用的哪一個就好了
}
}
-