<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # Java 默認方法教程 > 原文: [https://howtodoinjava.com/java8/default-methods-in-java-8/](https://howtodoinjava.com/java8/default-methods-in-java-8/) 在上一篇文章中,我們了解了 [**Lambda 表達式和函數式接口**](//howtodoinjava.com/java8/complete-lambda-expressions-tutorial-in-java/ "Complete lambda expressions tutorial") 。 現在,讓我們繼續進行討論,并討論另一個相關特性,即**默認方法**。 好吧,這對于 Java 開發人員來說確實是革命性的。 到 Java 7 為止,我們已經學到了很多關于接口的知識,而在編寫代碼或設計應用程序時,所有這些事情都已經牢記在心。 在引入默認方法之后,其中一些概念將從 Java 8 發生巨大變化。 ```java I will discuss following points in this post: What are default methods in java 8? Why default methods were needed in java 8? How conflicts are resolved while calling default methods? ``` ## Java 8 中的默認方法是什么? 默認方法使您可以向庫的接口添加新功能,并確保與為這些接口的較早版本編寫的代碼二進制兼容。 顧名思義,java 8 中的默認方法就是默認的。 如果不覆蓋它們,則它們是調用者類將調用的方法。 它們在接口中定義。 讓我們看一個例子: ```java public interface Moveable { default void move(){ System.out.println("I am moving"); } } ``` 可移動接口定義方法`move()`; 并提供了默認實現。 如果有任何類實現此接口,則無需實現其自己的`move()`方法版本。 它可以直接調用`instance.move()`; ```java public class Animal implements Moveable{ public static void main(String[] args){ Animal tiger = new Animal(); tiger.move(); } } Output: I am moving ``` 而且,如果類愿意定制行為,那么它可以提供自己的自定義實現并覆蓋該方法。 現在將調用它自己的自定義方法。 ```java public class Animal implements Moveable{ public void move(){ System.out.println("I am running"); } public static void main(String[] args){ Animal tiger = new Animal(); tiger.move(); } } Output: I am running ``` 這還沒有全部完成。 最好的部分是以下好處: 1. 靜態默認方法:您可以在接口中定義靜態默認方法,這些方法將對實現該接口的所有類實例可用。 這使您可以更輕松地在庫中組織幫助程序方法。 您可以將特定于接口的靜態方法保留在同一接口中,而不是在單獨的類中。 這使您可以在類之外定義方法,但仍可與所有子類共享。 2. 它們為您提供了一種非常理想的特性,可以在不觸及其代碼的情況下為多個類添加功能。 只需在它們都實現的接口中添加默認方法即可。 ## 為什么 Java 8 需要默認方法? 這是您下一個[**面試問題**](//howtodoinjava.com/java-interview-questions/ "Java Interview Questions")的不錯的選擇。 **最簡單的答案是在 Java 中啟用 lambda 表達式的特性。** Lambda 表達本質上是函數式接口的類型。 為了無縫支持 lambda 表達式,必須修改所有核心類。 但是,這些核心類(例如`java.util.List`)不僅在 JDK 類中實現,而且在數千個客戶端代碼中也實現。 核心類中任何不兼容的更改都將肯定會產生反作用,并且根本不會被接受。 默認方法打破了這種僵局,并允許在核心類中添加對函數式接口的支持。 讓我們來看一個例子。 以下是已添加到`java.lang.Iterable`的方法。 ```java default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } } ``` 在 Java 8 之前,如果必須迭代 Java 集合,則將獲得一個迭代器實例,并調用它的下一個方法,直到`hasNext()`返回`false`。 這是常見的代碼,我們在日常編程中已經使用了數千次。 語法也總是相同的。 因此,我們可以使其精簡嗎,使其僅占用一行代碼,仍然像以前一樣為我們完成工作。 上面的函數可以做到這一點。 現在要迭代并對列表中的每個項目執行一些簡單的操作,您需要做的是: ```java import java.util.ArrayList; import java.util.List; public class Animal implements Moveable{ public static void main(String[] args){ List<Animal> list = new ArrayList(); list.add(new Animal()); list.add(new Animal()); list.add(new Animal()); //Iterator code reduced to one line list.forEach((Moveable p) -> p.move()); } } ``` 因此,這里,在不破壞列表的任何自定義實現的情況下,已將其他方法添加到`List`中。 長期以來,它一直是 Java 中非常需要的特性。 現在就在我們身邊。 ## 調用默認方法時如何解決沖突? 到目前為止,一切都很好。 我們的所有基礎知識都很好。 現在轉到復雜的事情。 在 Java 中,一個類可以實現 N 個接口。 另外,一個接口也可以擴展另一個接口。 如果在兩個這樣的接口中聲明了默認方法,則該接口由單個類實現。 那么很明顯,類會混淆調用哪個方法。 **解決此沖突的規則如下:** 1)最優選的是類中的覆蓋方法。 如果在匹配任何內容之前找到它們,它們將被匹配并被調用。 2)選擇在“最特定的默認提供接口”中具有相同簽名的方法。 這意味著如果`Animal`類實現了兩個接口,即`Moveable`和`Walkable`,從而`Walkable`擴展了`Moveable`。 那么`Walkable`是最具體的接口,如果方法簽名匹配,則將從此處選擇默認方法。 3)如果`Moveable`和`Walkable`是獨立的接口,則會發生嚴重的沖突情況,并且編譯器將抱怨并無法確定。 您必須通過提供額外的信息來幫助編譯器,該信息應從哪個接口調用默認方法。 例如: ```java Walkable.super.move(); //or Moveable.super.move(); ``` 這就是這里的全部內容。 下次,當我想到一些有趣的事情時,我將繼續討論。 不要忘記發表您的評論/想法或問題。 **祝您學習愉快!**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看