在日常開發中可能很多人對JAVA8的一些新特性不太關注:
有一個新特性看似不起眼,一旦用到了則會覺得非常的方便;
很多人都覺得接口接口里面只能寫抽象方法,不能寫實現方法;
實際上在JAVA8更新后,接口就可以添加默認方法和靜態方法:默認方法用default修飾符修飾,會被其他接口繼承;而靜態方法使用static修飾符修飾;
非常典型的就是java.util.Map,有興趣的可以去瞧一瞧;
為什么要有接口默認方法?
舉一個很現實的例子:
我們的接口老早就寫好了,后面因為各種業務問題,避免不了要修改接口。
在 Java 8 之前,比如要在一個接口中添加一個抽象方法,那所有的接口實現類都要去實現這個方法,不然就會編譯錯誤,而某些實現類根本就不需要實現這個方法也被迫要寫一個空實現,改動會非常大。
所以,接口默認方法就是為了解決這個問題,只要在一個接口添加了一個默認方法,所有的實現類就自動繼承,不需要改動任何實現類,也不會影響業務,爽歪歪。
另外,接口默認方法可以被接口實現類重寫。
為什么要有接口靜態方法?
接口靜態方法和默認方法類似,只是接口靜態方法不可以被接口實現類重寫。
接口靜態方法只可以直接通過靜態方法所在的 接口名
.靜態方法名
來調用。
注意點
在接口多繼承的情況下,被繼承的接口如果存在相同的默認方法,是會引起編譯報錯的,如果在繼承接口類中不重寫此默認方法是會報錯的;
如果需要調用父類的方法可以通過 被繼承類的類名.super.默認方法名 的形式調用父類默認方法;
有一種情況下例外:就是多繼承的接口有相同的默認方法,也就是其中一個接口重寫了父類的默認方法,這種情況下不需要重寫默認方法;
默認方法與接口抽象方法定義相同:默認方法會優先於接口抽象方法,接口定義的方法會被忽略;