<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 接口與 Java 中的抽象類 > 原文: [https://howtodoinjava.com/oops/exploring-interfaces-and-abstract-classes-in-java/](https://howtodoinjava.com/oops/exploring-interfaces-and-abstract-classes-in-java/) 抽象類和接口是大多數 Java API 的兩個主要構建塊。 在本文中,我們將介紹 Java 接口和抽象類之間最明顯的區別。 ```java Table of Contents 1\. Abstract classes in java 2\. Interfaces in java 3\. Abstract classes vs Interfaces 4\. When to use abstract class and when to use interfaces 5\. Java 8 default methods in interfaces ``` 我將建議您先閱讀[抽象](//howtodoinjava.com/object-oriented/understanding-abstraction-in-java/),因為它是抽象類和接口背后的主要力量。 ## 1\. Java 中的抽象類 用最簡單的話來說,抽象類使用關鍵字`abstract`聲明為抽象。 它可能包含也可能不包含任何抽象方法。 JVM 將抽象類標識為**不完整類**,該類尚未定義其完整行為。 聲明一個類`abstract`僅能執行一件事:您無法創建該類的實例,僅此而已。 那么,為什么還要費心創建一個根本無法實例化的類呢? 答案在于解決某些關鍵設計問題的方法。 我們將在本文后面介紹這一部分。 #### 1.1 抽象類的語法 ```java abstract class TestAbstractClass { public abstract void abstractMethod(); public void normalMethod() { //method body } } ``` 這里,我們的`TestAbstractClass`有兩種方法,一種是抽象方法,第二種是常規方法。 抽象方法。 在類中使用抽象方法將迫使您將類聲明為抽象本身。 #### 1.2 抽象方法 **抽象方法**是未就位實現的方法。 抽象方法給類增加了不完整性,因此編譯器希望將整個類聲明為抽象。 在應用程序中使用抽象類的唯一方法是擴展此類。 如果沒有再次聲明其`abstract`,則可以實例化其子類。 子類繼承了超類的行為并且超類可以保留對子類的引用的特性在很多方面提高了抽象類的重要性。 ## 2\. Java 接口 接口是大多數 Java API 的另一個基本構建塊。 您將其命名為集合,I/O 或 SWT,您可以在任何地方看到它們的運行情況。 > 接口定義契約,實現類需要遵守這些契約。 這些契約本質上是未實現的方法。 Java 已經有一個未實現方法的關鍵字,即 `abstract`。 Java 提供了任何類都可以實現任何接口的規定,因此接口中聲明的所有方法只需公開。 #### 2.1 接口語法 ```java public interface TestInterface { void implementMe(); } ``` 對于上述接口,任何實現類都需要覆蓋`implementMe()`方法。 #### 2.2 抽象類實現接口 當實現一個接口并且不覆蓋該方法時,只有一種情況,即聲明實現類本身`abstract`。 ```java public abstract class TestMain implements TestInterface { //No need to override implement Me } ``` 否則,必須在您的類中實現方法`implementMe()`,而沒有任何其他異常。 ```java public class TestMain implements TestInterface { @Override public void implementMe() { // TODO Auto-generated method stub } } ``` ## 3)抽象類與接口 讓我們記下**抽象類和接口**之間的區別以便快速查看: 1. 接口的固有的所有方法是*公共*和*抽象*的。 您不能通過嘗試減少方法的可訪問性來覆蓋此行為。 您甚至不能聲明靜態方法。 僅公開和抽象。 另一方面,抽象類可以靈活地聲明方法。 您還可以定義受保護的可訪問性的抽象方法。 此外,還可以定義靜態方法,只要它們不是抽象的即可。 允許使用非抽象靜態方法。 2. 接口不能具有完全定義的方法。 根據定義,接口旨在提供唯一的契約。 抽象類可以具有非抽象方法,沒有任何限制。 您可以將任何關鍵字與非抽象方法一起使用,就像在其他任何類中一樣。 3. 任何想使用抽象類的類都可以使用關鍵字`extends`來擴展抽象類,而對于實現接口的關鍵字,則使用`implements`。 一個類只能擴展一個類,但可以實現任何數量的接口。 在 Java 中,此屬性通常稱為**多繼承**的模擬。 4. 接口絕對是`abstract`,不能實例化; Java 抽象類也無法實例化,但是可以在存在` main()`的情況下調用。 接下來,如果我們既有抽象方法又有主類,可能會出現一個問題,我們可以嘗試從`main()`調用抽象方法。 但是,此嘗試將失敗,因為`main()`方法始終是靜態的,而抽象方法永遠不能是靜態的,因此您永遠無法訪問靜態方法內的任何非靜態方法。 ## 4\. 何時使用抽象類以及何時使用接口 始終記住,在接口或抽象類之間選擇是二選一場景,在這種情況下選擇未經適當分析的任何人都會產生相同的結果。 了解當前問題后,必須非常明智地做出選擇。 讓我們嘗試在這里添加一些智慧。 #### 4.1 抽象類的部分行為 抽象類使您可以定義一些行為。 它使它們成為應用程序框架內的優秀候選人。 讓我們以[`HttpServlet`](https://docs.oracle.com/javaee/1.3/api/javax/servlet/http/HttpServlet.html "HTTP servlet")為例。 如果要使用 Servlets 技術開發 Web 應用程序,則必須繼承該類。 眾所周知,每個 Servlet 都有明確的生命周期階段,即初始化,服務和銷毀。 如果我們創建了每個 servlet,我們必須一次又一次地編寫關于初始化和銷毀??的同一段代碼。 當然,這將是一個很大的痛苦。 JDK 設計人員通過制作`HttpServlet`抽象類來解決此問題。 它具有為初始化 Servlet 和銷毀 Servlet 而編寫的所有基本代碼。 您只需要覆蓋某些方法即可在其中編寫與應用程序處理相關的代碼。 有道理吧! 可以使用接口添加上述特性嗎? 不,即使可以,對于大多數無辜的程序員來說,設計也將是一個地獄。 #### 4.2 契約專用接口 現在,讓我們看看接口的用法。 接口僅提供契約,實現類的責任是實現提供給它的每個契約。 如果您只想**定義類**的特征,并且要強制所有實現實體實現這些特征,則該接口是最合適的。 #### 4.3 示例 我想以集合框架中的`Map`接口為例。 它僅提供規則,以及映射在實踐中應如何表現。 例如它應該存儲鍵值對,應該可以使用鍵等訪問該值。這些規則在接口中采用抽象方法的形式。 所有實現類(例如[`HashMap`](//howtodoinjava.com/java/collections/how-hashmap-works-in-java/ "How hashmap works in java"),`HashTable`,`TreeMap`或[`WeakHashMap`](https://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html "WeakHashMap"))都不同地實現了所有方法,因此與其他方法相比具有不同的特性。 同樣,接口可用于定義職責分離。 例如,`HashMap`實現 3 個接口:`Map`,[`Serializable`](//howtodoinjava.com/java/serialization/a-mini-guide-for-implementing-serializable-interface-in-java/)和[`Clonable`](//howtodoinjava.com/java/cloning/cloneable-interface-is-broken-in-java/)。 每個接口定義了各自的職責,因此實現類選擇要實現的對象,因此將提供有限的功能。 ## 5\. 接口中的 Java 8 默認方法 使用 Java 8,您現在可以在接口中定義方法。 這些稱為默認方法。 默認方法使您可以向庫的接口添加新功能,并確保與為這些接口的較早版本編寫的代碼二進制兼容。 顧名思義,Java 8 中的默認方法就是默認的。 如果不覆蓋它們,則它們是調用者類將調用的方法。 ```java public interface Moveable { default void move(){ System.out.println("I am moving"); } } ``` 在上面的示例中,`Moveable`接口定義了方法`move()`,并且還提供了默認實現。 如果有任何類實現了此接口,則無需實現其自己的`move()`方法版本。 它可以直接調用`instance.move()`。 ```java public class Animal implements Moveable{ public static void main(String[] args){ Animal tiger = new Animal(); tiger.move(); //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(); //I am running } } ``` #### 5.1)Java 8 中抽象類和接口之間的區別 如果您看到了,我們現在也可以提供帶有接口的部分實現,就像抽象類一樣。 因此,從本質上說,接口與抽象類之間的界線變得非常狹窄。 它們現在提供幾乎相同的能力。 現在,只有一個大的區別是**您不能擴展多個類,而可以實現多個接口**。 除了這種區別之外,您還可以通過接口實現任何可能的功能,這些接口可以使抽象類成為可能,反之亦然。 希望您在 Java 中找到了有關**接口和抽象類的足夠信息**。 學習愉快!
                  <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>

                              哎呀哎呀视频在线观看