java面向對象23 JDK8中關於接口的新特性

/*

  • 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中的同名方法
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章