time: 2019年10月11日20:07:29
Type:java筆記
簡介
問題由來
default是在java8中引入的關鍵字,也可稱爲Virtual extension methods——虛擬擴展方法。
目的:是指,在接口內部包含了一些默認的方法實現(也就是接口中可以包含方法體,這打破了Java之前版本對接口的語法限制),從而使得接口在進行擴展的時候,不會破壞與接口相關的實現類代碼。
public interface SimpleInterface {
public void doSomeWork();
//A default method in the interface created using "default" keyword
//使用default關鍵字創在interface中直接創建一個default方法,該方法包含了具體的實現代碼
default public void doSomeOtherWork(){
System.out.println("DoSomeOtherWork implementation in the interface");
}
}
問題的背景(why)
爲什麼要有這個特性?
首先,之前的接口是個雙刃劍,好處是面向抽象而不是面向具體編程,缺陷是,當需要修改接口時候,需要修改全部實現該接口的類,目前的java8之前的集合框架沒有foreach方法,通常能想到的解決辦法是在JDK裏給相關的接口添加新的方法及實現。然而,對於已經發布的版本,是沒法在給接口添加新方法的同時不影響已有的實現。所以引進的默認方法。他們的目的是爲了解決接口的修改與現有的實現不兼容的問題。1
說白了一句話:就是在不影響已有實現方式的形式,擴展接口。使用default 關鍵字指定。
實例
實例一
- 簡單的實現
public interface SimpleInterface {
public void doSomeWork();
}
class SimpleInterfaceImpl implements SimpleInterface{
@Override
public void doSomeWork() {
System.out.println("Do Some Work implementation in the class");
}
public static void main(String[] args) {
SimpleInterfaceImpl simpObj = new SimpleInterfaceImpl();
simpObj.doSomeWork();
}
}
- 後來的問題
問題場景:開發者想要修改已有的接口,擴展接口的功能,如何解決?
假如:添加了一個接口方法,修改了接口
public interface SimpleInterface {
public void doSomeWork();
public void doSomeOtherWork();
}
運行result
違背了接口的實現方式,實現接口的必須實現它的所有方法。
總結
解決方式:default 關鍵字
public interface SimpleInterface {
public void doSomeWork();
//A default method in the interface created using "default" keyword
//使用default關鍵字創在interface中直接創建一個default方法,該方法包含了具體的實現代碼
default public void doSomeOtherWork(){
System.out.println("DoSomeOtherWork implementation in the interface");
}
}
class SimpleInterfaceImpl implements SimpleInterface{
@Override
public void doSomeWork() {
System.out.println("Do Some Work implementation in the class");
}
/*
* Not required to override to provide an implementation
* for doSomeOtherWork.
* 在SimpleInterfaceImpl裏,不需要再去實現接口中定義的doSomeOtherWork方法
*/
public static void main(String[] args) {
SimpleInterfaceImpl simpObj = new SimpleInterfaceImpl();
simpObj.doSomeWork();
simpObj.doSomeOtherWork();
}
}
這樣就解決了接口的擴展問題。
實踐注意點:接口的default 是在擴展接口的功能的使用,在這一需求場景下。
- 作用:擴展類的接口
- 使用場景:後期修改擴展接口的功能。
- why要這種方式實現?
做到:修改代碼,不影響其他實體,這裏指的是:不需要修改接口實現類。就可以實現接口的功能擴展(在java個體之間互不影響的封裝的設計原則。)2
補充內容1:default 衝突
問題:使用默認方法,出現了衝突的解決方案是什麼?
宏觀上就是:遵循兩個原則
要你命三千又三千
權益問題 聯繫侵刪