Java 8導入了Default Methods(預設方法)的特性,其為interface的實作方法。
在Java 8以前定義在介面的方法都不可有實作(但可以有靜態方法static method的實作),介面的方法實作必須透過類別來覆寫(override),一旦介面增加新的方法其實作類別也必須增加該方法的實作,否則無法通過編譯。
例如類別ClassA
實作介面InterfaceA
,有一個sayHello()
方法。
public interface InterfaceA {
public void sayHello();
}
類別ClassA
實作InterfaceA
介面
public class ClassA implements InterfaceA{
@Override
public void sayHello() {
System.out.println("hello");
}
}
如果InterfaceA
增加了一個方法sayHi()
,則ClassA
必須實作sayHi()
,否則無法通過編譯。
Java 8加入了default methods後,提高了Java向後相容的能力,使得在舊介面添加新的方法變得容易。例如Collection
或List
繼承的Iterable
介面原本沒有forEach()
方法,Java 8為了增加Lambda語法的可用性,所以加入了forEach()
方法。如果沒有default methods,則實作此介面的類別將都必須實作forEach()
方法,使得在擴展舊介面變得相對困難。
承上面的例子,如果在InterfaceA的新方法的存取修飾子前加入default
,則此方法即為default methods。
default methods的實作是寫在介面的方法中,因此實作類別不實作default methods仍可正常編譯。
如果類別同時繼承兩個介面,而兩個介面都擁有同樣名稱的default methods,類別就一定要覆寫該方法了,因為會出現Duplicate default methods的錯誤。
沒有留言:
張貼留言