類與介面(三)java中的介面與巢狀介面

程式設計師歐陽思海發表於2018-04-28

一、介面

1. 介面簡介

介面: 是java的一種抽象型別,是抽象方法的集合。介面比抽象類更加抽象的抽象型別。

介面語法

[修飾符] [abstract] interface 介面名 [extends 父介面名列表]{
[public] [static] [final] 常量;
[public] [abstract] 方法;
[public] [static] 方法{};//JDK1.8後
[public] [static] 類/介面;
}
複製程式碼

2. 介面成員的修飾符

介面中的所有成員的訪問許可權預設強制是 public

  • 變數: 預設強制是public static final
  • 方法: 預設強制是public abstract,即抽象方法。但JDK1.8後,允許定義靜態方法public static,介面存在非抽象方法;
  • 內部類/介面: 預設強制是 public static

下面例子中的介面中定義了各種介面成員:

public interface InterfaceTest {

    int a = 10;//全域性變數預設強制是 public static final
    
     public static void staticMethod() {  //靜態方法,JDK1.8下編譯通過
         System.out.println("");
     }
     
      int abstractMethod(); //抽象方法
     
     public static abstract class InnerClass{//抽象內部類,預設強制 public static
         //......
     }
     
     enum MyEnum{RED,BLUE,GRREN} //列舉類,預設強制 public static
     
     interface InnerInteerface{ //巢狀介面,預設強制 public static
         void aa();
     }
}

class MyClass implements InterfaceTest{//實現上面的介面

    @Override
    public int abstractMethod() {//實現抽象方法
        
        return 0;
    }
}
複製程式碼

注意一下,實現介面並不需要實現介面裡面的內部抽象類成員、或者巢狀介面成員;

3. 介面的多繼承

介面是可以繼承多個介面(在類中,是不允許多繼承的)。由於介面的例項成員方法都是抽象方法,所以多繼承不會對介面造成太大影響(不同父介面可以定義相同的方法),但還是有一點要注意的,**多繼承介面時,從父介面繼承下來的方法,有相同的方法名,但不滿足方法過載的條件,就會衝突。**如果出現這種情況,編譯將失敗,不允許多繼承。

interface A{
    void sameMethodA();
}

interface B{
    void sameMethodA();
    void sameMethodB(int a);//返回型別是void
}

interface C{
    int sameMethodB(int a);//返回型別是 int
}

interface D extends A,B{ //編譯通過,即使A,B定義了相同方法
    
}

interface E extends B,C{//編譯失敗
    
}
複製程式碼

字介面D多繼承父介面A,B成功,但子介面E卻多繼承父介面B,C失敗,就是因為兩個介面定義的sameMethodB()除了返回型別外,方法名、引數列表都一樣,這不滿足方法過載,導致繼承時方法衝突。

如果非得要多繼承,Java的解決方案是使用 內部類或巢狀介面;

4. 介面與抽象類的區別

介面與抽象類的區別:

  • 抽象級別不一樣: 介面更加抽象,JDK1.8前只允許抽象方法,JDK1,8後才允許存在靜態方法;抽象類的抽象基本低,允許存在具體方法,甚至抽象類中可以沒有抽象方法。但有抽象方法的類就必須是抽象類;
  • 介面對成員的定義時的修飾符都有固定的限制,參考前面;抽象類定義成員與普通類是一樣的;
  • 介面中不允許定義初始化塊(靜態或例項),但抽象類允許定義這兩種初始化塊;
  • 介面中不能定義構造方法,但抽象類允許定義構造方法。

補充:抽象類中的抽象方法的訪問許可權是不能是private

二、巢狀介面

巢狀介面: 就是定義在類或介面中的介面。

巢狀介面的修飾符限制:

  • 不論定義在介面,還是類中,巢狀介面預設強制是 static。這意味著,巢狀介面是沒有區域性的巢狀介面。
  • 介面定義在類中,可以使用四種訪問許可權,定義在介面種,則只有public

出處:http://www.cnblogs.com/jinggod/p/8503146.html 文章有不當之處,歡迎指正,你也可以關注我的微信公眾號:好好學java,獲取優質學習資源。

相關文章