[Java物件導向]

Duancf發表於2024-07-09

物件導向

修飾符

介面

介面中方法的訪問修飾符預設是public abstract

在 Java 介面中,介面中的方法預設是公共的(public),且不允許使用其他的訪問修飾符。介面中定義的方法會被隱式地指定為 public abstract,這兩個修飾符可以省略,因為它們是預設的。

所以,Java 介面中方法的定義形式通常是:

public interface MyInterface {
    void myMethod(); // 隱式的 public abstract
}

在 Java 8 及之後的版本中,介面還引入了預設方法(default methods)和靜態方法(static methods)。這兩種方法可以包含方法體,而不僅僅是宣告。這兩種方法的訪問修飾符分別是:

  1. 預設方法(Default Methods):

    • 預設方法使用 default 關鍵字進行宣告,它們在介面中有一個預設的實現。預設方法可以被介面的實現類繼承或者覆蓋。
    public interface MyInterface {
        default void myDefaultMethod() {
            // 預設方法的實現
        }
    }
    
  2. 靜態方法(Static Methods):

    • 靜態方法使用 static 關鍵字進行宣告,它們在介面中有一個靜態的實現。靜態方法可以直接透過介面名呼叫,不需要透過實現類的例項呼叫。
    public interface MyInterface {
        static void myStaticMethod() {
            // 靜態方法的實現
        }
    }
    

總結起來,Java 介面中方法的訪問修飾符預設是 public abstract,但對於預設方法和靜態方法,可以使用 defaultstatic 關鍵字進行修飾。預設方法和靜態方法的引入使得介面可以包含一些具體的實現,而不僅僅是抽象方法。

實現介面的類,重寫介面中的方法時,應該將訪問修飾符定為public

當一個類實現一個介面時,類需要遵循以下訪問修飾符的要求:

  1. 介面方法實現:
  • 實現類必須提供介面中定義的所有方法的實現,包括預設方法。如果不提供全部方法的實現,那麼該類必須宣告為抽象類(abstract)。
  1. 介面方法的訪問修飾符:

    • 實現類中的方法必須使用 public 訪問修飾符,因為介面中的方法預設是 public 的。如果使用其他訪問修飾符(例如 protectedprivate),會導致編譯錯誤。
    public class MyClass implements MyInterface {
        public void myMethod() {
            // 實現介面方法
        }
    
        // 實現預設方法
        public void myDefaultMethod() {
            // 預設方法的實現
        }
    }
    
  2. 介面中靜態方法的訪問:

    • 靜態方法可以透過介面名直接呼叫,不需要實現類提供具體實現。實現類可以選擇提供一個相同簽名的靜態方法,但這只是一個靜態方法而不是介面中的靜態方法的實現。
    public class MyClass implements MyInterface {
        public void myMethod() {
            // 實現介面方法
        }
    
        // 實現預設方法
        public void myDefaultMethod() {
            // 預設方法的實現
        }
    
        // 提供一個靜態方法,但不是介面中的靜態方法的實現
        public static void myStaticMethod() {
            // 靜態方法的實現
        }
    }
    

總體來說,實現類中實現介面的方法需要使用 public 訪問修飾符,並提供介面中所有抽象方法的具體實現。對於預設方法和靜態方法,可以選擇性地提供實現。

抽象類和介面的區別

  1. 抽象類用來繼承,介面用來實現,定義規範

  2. 抽象類用來規定物件長什麼樣子,但是介面用來規定物件有什麼行為。

  3. 介面中的成員變數只能是public static final型別的,靜態方法和預設方法只能是public或private訪問級別,抽象方法只能是public訪問級別。

  4. 抽象類中可以定義各種型別的成員變數,並且成員方法可以處於四種訪問級別。這是抽象類的優勢所在,它可以包含所有子類的共同例項變數,避免在子類中重複定義,而且抽象類可以利用四種訪問級別來靈活地設定對實現細節的封裝程度。

  5. 一個類只能繼承一個直接的父類;但一個類可以實現多個介面,這是介面的優勢所在,也就是我們可以利用介面實現多繼承。

    對於已經存在的[繼承樹],由於一個類允許實現多個介面,因此可以方便地從類中自下而上抽象出新的介面。另一方面,由於一個類只能繼承一個直接的[父類],因此從類中自下而上抽象出新的抽象類卻不那麼容易。所以介面更有利於軟體系統的維護與重構。

    從語義上有區分,介面是對多個類的共同行為(或者說對外提供的服務)的抽象,抽象類是對根據多個類的共性(包括屬性和行為)進行的型別抽象。

(1)介面是軟體系統中最高層次的抽象,宣告瞭軟體系統對外提供的服務。

(2)介面本身必須十分穩定,介面一旦制定,就不允許隨意修改,否則會對介面的實現類以及介面的訪問類都造成影響。

(3)通常用抽象類來定製軟體系統中的擴充套件點。可以把抽象類看作是介於“抽象”和“實現”之間的半成品,抽象類力所能及地完成了部分實現細節,但還有一些功能有待於它的子類去實現和擴充套件。

我之前寫過一個專案,我需要一個抽象的快取框架,其中就用到了抽象類,這個抽象類本身就帶有三個hashmap,所以我們只需要繼承這個類就可以直接使用這三個hashmap,

相關文章