/*
- JDK8中關於接口的新特性
- JDK8以後的版本中接口內的結構除了可以定義全局常量和抽象方法外,還可以定義靜態方法與默認方法
- 靜態方法:使用 static 關鍵字修飾。可以通過接口直接調用靜態方法,並執行其方法體。經常在相互一起使用的類中使用靜態方法。
- 可以在標準庫中找到像Collection/Collections或者Path/Paths這樣成對的接口和類。
- 默認方法:默認方法使用 default 關鍵字修飾。可以通過實現類對象來調用。我們在已有的接口中提供新方法的同時,還保持了與舊版本代碼的兼容性。
- 比如:java 8 API中對Collection、List、Comparator等接口提供了豐富的默認方法
- 1,接口中定義的靜態方法只能被接口調用。(類似工具類)
- 2,通過實現類對象可以調用接口中的默認方法。實現類中可以重寫接口裏面的默認方法。
- 這樣對象調用時,調用的是重寫的方法。
- 3,若一個接口中定義了一個默認方法,而父類中也定義了一個同名同參數的非抽象方法,則不會出現衝突問題。因爲此時遵守:類優先原則。
- 接口中具有相同名稱和參數的默認方法會被忽略。在子類沒有重寫此默認方法 的情況下優先調用父類的此方法。
- 優先順序爲子類重寫方法–父類方法–接口方法
- 4,若一個接口中定義了一個默認方法,而另外一個接口中也定義了一個同名同參數的方法(不管此方法是否是默認方法),
- 在實現類同時實現了這兩個接口時,會出現:接口衝突。解決辦法:實現類必須覆蓋接口中同名同參數的方法,來解決衝突。
- 5,子類中調用父類中的重寫方法使用super().方法名的方式,指定調用接口中重寫的默認方法使用接口名.super.方法名();的方式。
*/
package object_chapter2;
public class Object_Interface_JDK8 {
public static void main(String[] args) {
HighLevelTest t = new HighLevelTest();
// t.method1();//接口中定義的靜態方法不會被實現類繼承,無法通過實現類的對象調用
HighLevel.method1();//接口中的靜態方法只能被接口直接調用
t.method2();
HighLevelTest1 t1 = new HighLevelTest1();
t1.method2();
HighLevelTest2 t2 = new HighLevelTest2();
t2.method2();
System.out.println("----------------");
t2.method3();
}
}
interface HighLevel{
//靜態方法
static void method1() {
System.out.println("平安無事");
}
//默認方法
default void method2() {
System.out.println("小心火燭");
}
}
interface HighLevel2{
default void method2() {
System.out.println("天下太平");
}
}
class SuperClass{
public void method2() {//此處必須加public否則會報錯 The inherited method SuperClass.method2() cannot hide the public abstract method in HighLevel2
// 父類同名同參方法的權限不能小於接口中的方法。
System.out.println("闔家團圓");
}
}
class HighLevelTest implements HighLevel{//接口中沒有抽象方法可以不用重寫
}
class HighLevelTest1 implements HighLevel,HighLevel2{
@Override
public void method2() {
// TODO Auto-generated method stub
// HighLevel.super.method2();//指明此method2()方法調用的是HighLevel接口中的同名方法,解決衝突問題
// HighLevel2.super.method2();//指明此method2()方法調用的是HighLevel2接口中的同名方法
System.out.println("河清海晏");//或者重寫method2()方法來解決問題
}//接口中沒有抽象方法可以不用重寫
}
class HighLevelTest2 extends SuperClass implements HighLevel,HighLevel2{
void method3() {
super.method2();//調用父類中的同名方法
HighLevel.super.method2();//調用接口HighLevel中的同名方法
HighLevel2.super.method2();//調用接口HighLevel2中的同名方法
}
}