Java介面

java中的介面是類的藍圖。 它有靜態常量和抽象方法。java中的介面是一種實現抽象的機制。 介面中只有抽象方法而不是方法體。介面用於在Java中實現抽象和多重繼承。

Java介面也表示IS-A關係。它不能像抽象類一樣被實例化。

為什麼要使用Java介面?

需要使用介面主要有三個原因。如下面給出。

  • 它用於實現抽象。
  • 通過介面,可以支持多重繼承的功能。
  • 它可用於實現松耦合。

Java 8介面的改進

由於Java 8,介面可以有默認和靜態方法,稍後討論。

由編譯器內部添加
java編譯器在介面方法之前添加publicabstract關鍵字。還有,它在數據成員之前添加publicstaticfinal關鍵字。

換句話說,介面字段默認是publicstaticfinal,方法默認是publicabstract

瞭解類和介面之間的關係

如下圖所示,一個類擴展了另一個類,一個介面擴展了另一個介面,一個類實現了一個介面。

Java介面示例

在這個例子中,Printable介面只有一個方法,它的實現是在A類中提供的。

interface printable {
    void print();
}

class A6 implements printable {
    public void print() {
        System.out.println("Hello, Interface");
    }

    public static void main(String args[]) {
        A6 obj = new A6();
        obj.print();
    }
}

上面代碼執行結果如下 -

Hello, Interface

Java介面示例:Drawable

在這個例子中,Drawable介面只有一個方法。 它的實現由RectangleCircle類提供。 在實際情況下,介面由一些開發者定義,但實現由不同的實現提供者提供。 並且它被別人使用。實現部分被使用介面的用戶隱藏。

創建一個 Java 檔:TestInterface1.java,其代碼如下 -

//Interface declaration: by first user
interface Drawable {
    void draw();
}

// Implementation: by second user
class Rectangle implements Drawable {
    public void draw() {
        System.out.println("drawing rectangle");
    }
}

class Circle implements Drawable {
    public void draw() {
        System.out.println("drawing circle");
    }
}

// Using interface: by third user
class TestInterface1 {
    public static void main(String args[]) {
        Drawable d = new Circle();// In real scenario, object is provided by
                                    // method e.g. getDrawable()
        d.draw();
    }
}

執行上面代碼得到以下結果 -

drawing circle

Java介面示例:Bank

讓我們來看看另一個提供了Bank介面實現的java介面的例子。創建一個 Java 檔:TestInterface2.java,其代碼如下 -

interface Bank {
    float rateOfInterest();
}

class SBI implements Bank {
    public float rateOfInterest() {
        return 9.15f;
    }
}

class PNB implements Bank {
    public float rateOfInterest() {
        return 9.7f;
    }
}

class TestInterface2 {
    public static void main(String[] args) {
        Bank b = new SBI();
        System.out.println("ROI: " + b.rateOfInterest());
    }
}

執行上面代碼得到以下結果 -

ROI: 9.15

Java多繼承介面

如果一個類實現了多個介面,或者一個介面擴展了多個介面,即被稱為多重繼承。

參考以下示例代碼的實現 -

interface Printable {
    void print();
}

interface Showable {
    void show();
}

class A7 implements Printable, Showable {
    public void print() {
        System.out.println("Hello");
    }

    public void show() {
        System.out.println("Welcome");
    }

    public static void main(String args[]) {
        A7 obj = new A7();
        obj.print();
        obj.show();
    }
}

執行上面代碼得到以下結果 -

Hello
Welcome

問題:在java中不支持通過類實現多繼承,但可通過介面實現,為什麼?

正如在繼承章節中所解釋的,在類中不支持多重繼承是因為模糊。 但是在介面的情況下可以支持,因為介面沒有歧義,介面的具體實現由實現類提供。 例如:

interface Printable {
    void print();
}

interface Showable {
    void print();
}

class TestTnterface3 implements Printable, Showable {
    public void print() {
        System.out.println("Hello");
    }

    public static void main(String args[]) {
        TestTnterface1 obj = new TestTnterface1();
        obj.print();
    }
}

上面代碼執行得到以下結果 -

Hello

從上面的例子可以看到,PrintableShowable介面有相同的方法,但它的實現是由TestTnterface1類提供的,所以沒有歧義。

介面繼承

類可以實現多個介面,但介面也擴展另一個介面。

interface Printable {
    void print();
}

interface Showable extends Printable {
    void show();
}

class TestInterface4 implements Showable {
    public void print() {
        System.out.println("Hello");
    }

    public void show() {
        System.out.println("Welcome");
    }

    public static void main(String args[]) {
        TestInterface4 obj = new TestInterface4();
        obj.print();
        obj.show();
    }
}

執行上面代碼,得到如下結果 -

Hello
Welcome

Java 8介面中的默認方法

從Java 8開始,我們可以在介面中有方法體。 但需要使其為默認方法。現在來看看一個例子,創建一個Java檔:TestInterfaceDefault.java,其代碼如下 -

interface Drawable {
    void draw();

    default void msg() {
        System.out.println("default method");
    }
}

class Rectangle implements Drawable {
    public void draw() {
        System.out.println("drawing rectangle");
    }
}

class TestInterfaceDefault {
    public static void main(String args[]) {
        Drawable d = new Rectangle();
        d.draw();
        d.msg();
    }
}

執行上面代碼,得到如下結果 -

drawing rectangle
default method

Java 8介面中的靜態方法

從Java 8開始,我們可以在介面中有靜態方法。 讓我們來看看下麵的一個例子,創建一個Java檔:TestInterfaceStatic.java 其代碼如下:

interface Drawable {
    void draw();

    static int cube(int x) {
        return x * x * x;
    }
}

class Rectangle implements Drawable {
    public void draw() {
        System.out.println("drawing rectangle");
    }
}

class TestInterfaceStatic {
    public static void main(String args[]) {
        Drawable d = new Rectangle();
        d.draw();
        System.out.println(Drawable.cube(3));
    }
}

執行上面代碼,得到如下結果 -

drawing rectangle
27

問題:什麼是標記或標記的介面?

沒有成員的介面(僅定義一個空的介面)稱為標記或標記介面。 例如:可序列化,可克隆,遠程等。它們用於向JVM提供一些基本資訊,以便JVM可以執行一些有用的操作。

//How Serializable interface is written?
public interface Serializable{
}

Java嵌套介面

注意: 一個介面中可以有另一個介面,即被稱為嵌套介面。有關於這方面的知識,將在嵌套類的章節中詳細學習。 例如:

interface printable {
    void print();

    interface MessagePrintable {
        void msg();
    }
}

上一篇: Java抽象類 下一篇: Java抽象類和介面的區別