默認方法(default method)是Java 8中引入的新功能,它使得在介面中添加新方法成為了一種很方便的事情。默認方法的本質是為了解決Java中遺留的多重繼承問題,即在同一介面中定義的兩個抽象方法實現衝突的問題。使用默認方法,可以在介面中提供一個默認實現,這樣介面的實現類中就不需要重複實現相同的方法了。
一、默認方法的定義與用法
默認方法是指在介面中提供了一個方法的默認實現,實現類可以繼承這個默認實現,也可以自行提供一個覆蓋它的實現。默認方法的定義格式如下:
public interface InterfaceName { default returnType methodName(parameterList) { // 方法體 } }
下面是一個簡單的例子,在介面中定義了一個默認方法,並在實現類中繼承這個默認方法:
interface MyInterface { default void printDefault() { System.out.println("This is a default method!"); } } class MyClass implements MyInterface { // 不重寫默認方法 } public static void main(String[] args) { MyClass myClass = new MyClass(); myClass.printDefault(); }
在上面的例子中,介面MyInterface中定義了一個默認方法printDefault(),實現類MyClass繼承了這個默認方法。在主方法中,我們創建了一個MyClass實例myClass,並調用了它的printDefault()方法。由於實現類沒有重寫這個默認方法,因此輸出結果為「This is a default method!」。
如果我們在實現類中重寫這個默認方法,就可以覆蓋介面中的默認實現:
class MyClass implements MyInterface { @Override public void printDefault() { System.out.println("This is a customized method!"); } }
在上面的代碼中,我們重寫了printDefault()方法,並將輸出內容改為「This is a customized method!」。輸出結果將會是這樣。我們可以看到,在實現類中重寫了默認方法之後,其輸出內容已經改變了。
二、默認方法的多重繼承問題
在Java 8之前,如果一個類想要繼承多個父類中的方法,就必須使用介面實現多重繼承。但是這種方式存在多種問題。其中最常見的問題是方法實現衝突,即在同一介面中定義的兩個抽象方法實現衝突的問題。在Java 8中,我們可以使用默認方法來解決這個問題。
下面是一個示例,其中Dog和Fish都實現了Animal介面:
interface Animal { default void sleep() { System.out.println("Animal sleeps."); } } class Dog implements Animal { @Override public void sleep() { System.out.println("Dog sleeps."); } } class Fish implements Animal { @Override public void sleep() { System.out.println("Fish sleeps."); } } public static void main(String[] args) { Animal dog = new Dog(); Animal fish = new Fish(); dog.sleep(); // 輸出:"Dog sleeps." fish.sleep(); // 輸出:"Fish sleeps." }
在上面的例子中,Animal介面中定義了一個默認方法sleep(),它的實現是「Animal sleeps.」。Dog和Fish類分別實現了Animal介面,並重寫了sleep()方法。在主方法中,我們分別創建了Dog和Fish的實例,並調用它們的sleep()方法。輸出結果分別是「Dog sleeps.」和「Fish sleeps.」。可以看到,通過在介面中定義一個默認方法,我們成功地解決了多重繼承中方法實現衝突的問題。
三、默認方法的注意事項
儘管默認方法在Java 8中帶來了很多新的便利,但是在使用時還是需要注意一些事項。下面是一些需要注意的地方:
1、默認方法與抽象方法的區別
介面中既可以定義抽象方法,也可以定義默認方法。這兩者之間的最大區別就是,抽象方法必須由實現類來實現,而默認方法不是必須實現的。如果一個類同時實現了兩個介面,在這兩個介面中都定義了同名的默認方法,那麼實現類必須重寫這個默認方法。否則編譯器就會報錯。
2、默認方法與靜態方法的區別
介面中的靜態方法和普通方法一樣,必須具有方法體。但是默認方法沒有這個限制,因為它可以有系統提供的默認實現(即方法體)。在介面中定義靜態方法時,必須要有方法體,否則編譯器會報錯。
3、默認方法與繼承的區別
默認方法相對於繼承具有更高的優先順序。如果一個類繼承了一個父類,並且實現了一個介面,在這個介面和父類中都定義了同名的方法,那麼子類會優先使用父類中的方法,而不是介面中的方法。
4、默認方法的訪問許可權
默認方法與介面中的其它方法一樣,都是公共的(public),因此它們可以在實現類外部被調用。
四、總結
在本文中,我們通過介紹Java 8中引入的默認方法,介紹了默認方法的定義與用法、多重繼承問題、注意事項等方面的內容。通過學習本文,我們可以更深入地了解默認方法的作用與使用方法,幫助Java工程師更好地應用默認方法在工程中。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/154773.html