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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 抽象類和接口的區別 ### 抽象類 抽象類是用來捕捉子類的通用特性的 。它不能被實例化,只能被用作子類的超類。抽象類是被用來創建繼承層級里子類的模板。以JDK中的GenericServlet為例: ~~~ public abstract class GenericServlet implements Servlet, ServletConfig, Serializable { // abstract method abstract void service(ServletRequest req, ServletResponse res); void init() { // Its implementation } // other method related to Servlet } ~~~ 當HttpServlet類繼承GenericServlet時,它提供了service方法的實現: ~~~ public class HttpServlet extends GenericServlet { void service(ServletRequest req, ServletResponse res) { // implementation } protected void doGet(HttpServletRequest req, HttpServletResponse resp) { // Implementation } protected void doPost(HttpServletRequest req, HttpServletResponse resp) { // Implementation } // some other methods related to HttpServlet } ~~~ ### 接口 接口是抽象方法的集合。如果一個類實現了某個接口,那么它就繼承了這個接口的抽象方法。這就像契約模式,如果實現了這個接口,那么就必須確保使用這些方法。接口只是一種形式,接口自身不能做任何事情。以Externalizable接口為例: ~~~ public interface Externalizable extends Serializable { void writeExternal(ObjectOutput out) throws IOException; void readExternal(ObjectInput in) throws IOException, ClassNotFoundException; } ~~~ 當你實現這個接口時,你就需要實現上面的兩個方法: ~~~ public class Employee implements Externalizable { int employeeId; String employeeName; @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { employeeId = in.readInt(); employeeName = (String) in.readObject(); } @Override public void writeExternal(ObjectOutput out) throws IOException { out.writeInt(employeeId); out.writeObject(employeeName); } } ~~~ ### 抽象類和接口的對比 | 參數 | 抽象類 | 接口 | | --- | --- | --- | | 默認的方法實現 | 它可以有默認的方法實現 接口完全是抽象的 | 它根本不存在方法的實現 | | 實現 | 子類使用extends關鍵字來繼承抽象類。如果子類不是抽象類的話,它需要提供抽象類中所有聲明的方法的實現。 | 子類使用關鍵字implements來實現接口。它需要提供接口中所有聲明的方法的實現 | | 構造器 | 抽象類可以有構造器 | 接口不能有構造器 | | 與正常Java類的區別 | 除了你不能實例化抽象類之外,它和普通Java類沒有任何區別 | 接口是完全不同的類型 | | 訪問修飾符 | 抽象方法可以有public、protected和default這些修飾符 | 接口方法默認修飾符是public。你不可以使用其它修飾符。 | | main方法 | 抽象方法可以有main方法并且我們可以運行它 | 接口沒有main方法,因此我們不能運行它。 | | 多繼承 | 抽象方法可以繼承一個類和實現多個接口 | 接口只可以繼承一個或多個其它接口 | | 速度 | 它比接口速度要快 | 接口是稍微有點慢的,因為它需要時間去尋找在類中實現的方法。 | | 添加新方法 | 如果你往抽象類中添加新的方法,你可以給它提供默認的實現。因此你不需要改變你現在的代碼。 | 如果你往接口中添加方法,那么你必須改變實現該接口的類。 | ### 什么時候使用抽象類和接口 * 如果你擁有一些方法并且想讓它們中的一些有默認實現,那么使用抽象類吧。 * 如果你想實現多重繼承,那么你必須使用接口。由于Java不支持多繼承,子類不能夠繼承多個類,但可以實現多個接口。因此你就可以使用接口來解決它。 * 如果基本功能在不斷改變,那么就需要使用抽象類。如果不斷改變基本功能并且使用接口,那么就需要改變所有實現了該接口的類。 * * * * * * ## 利用枚舉實現單例模式 ### Java枚舉基本用法 枚舉的用法比較多,本文主要旨在介紹利用枚舉實現單例模式的原理,所以這里也主要介紹一些相關的基礎內容。 首先,枚舉類似類,一個枚舉可以擁有成員變量,成員方法,構造方法。先來看枚舉最基本的用法: ~~~ enum Type{ A,B,C,D; } ~~~ 創建enum時,編譯器會自動為我們生成一個繼承自java.lang.Enum的類,我們上面的enum可以簡單看作: ~~~ class Type extends Enum{ public static final Type A; public static final Type B; ... } ~~~ 對于上面的例子,我們可以把Type看作一個類,而把A,B,C,D看作類的Type的實例。 當然,這個構建實例的過程不是我們做的,一個enum的構造方法限制是private的,也就是不允許我們調用。 ### “類”方法和“實例”方法 上面說到,我們可以把Type看作一個類,而把A,B。。。看作Type的一個實例。同樣,在enum中,我們可以定義類和實例的變量以及方法。看下面的代碼: ~~~ enum Type{ A,B,C,D; static int value; public static int getValue() { return value; } String type; public String getType() { return type; } } ~~~ 在原有的基礎上,添加了類方法和實例方法。我們把Type看做一個類,那么enum中靜態的域和方法,都可以視作類方法。和我們調用普通的靜態方法一樣,這里調用類方法也是通過 Type.getValue()即可調用,訪問類屬性也是通過Type.value即可訪問。 下面的是實例方法,也就是每個實例才能調用的方法。那么實例是什么呢?沒錯,就是A,B,C,D。所以我們調用實例方法,也就通過 Type.A.getType()來調用就可以了。 最后,對于某個實例而言,還可以實現自己的實例方法。再看下下面的代碼: ~~~ enum Type{ A{ public String getType() { return "I will not tell you"; } },B,C,D; static int value; public static int getValue() { return value; } String type; public String getType() { return type; } } ~~~ 這里,A實例后面的{…}就是屬于A的實例方法,可以通過覆蓋原本的方法,實現屬于自己的定制。 除此之外,我們還可以添加抽象方法在enum中,強制ABCD都實現各自的處理邏輯: ~~~ enum Type{ A{ public String getType() { return "A"; } },B { @Override public String getType() { return "B"; } },C { @Override public String getType() { return "C"; } },D { @Override public String getType() { return "D"; } }; public abstract String getType(); } ~~~ ### 枚舉單例 有了上面的基礎,我們可以來看一下枚舉單例的實現方法: ~~~ class Resource{ } public enum SomeThing { INSTANCE; private Resource instance; SomeThing() { instance = new Resource(); } public Resource getInstance() { return instance; } } ~~~ 上面的類Resource是我們要應用單例模式的資源,具體可以表現為網絡連接,數據庫連接,線程池等等。 獲取資源的方式很簡單,只要 SomeThing.INSTANCE.getInstance() 即可獲得所要實例。下面我們來看看單例是如何被保證的: 首先,在枚舉中我們明確了構造方法限制為私有,在我們訪問枚舉實例時會執行構造方法,同時每個枚舉實例都是static final類型的,也就表明只能被實例化一次。在調用構造方法時,我們的單例被實例化。 也就是說,因為enum中的實例被保證只會被實例化一次,所以我們的INSTANCE也被保證實例化一次。 可以看到,枚舉實現單例還是比較簡單的,除此之外我們再來看一下Enum這個類的聲明: ~~~ public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable ~~~ 可以看到,枚舉也提供了序列化機制。某些情況,比如我們要通過網絡傳輸一個數據庫連接的句柄,會提供很多幫助。 最后借用 《Effective Java》一書中的話, `單元素的枚舉類型已經成為實現Singleton的最佳方法。`
                  <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>

                              哎呀哎呀视频在线观看