首頁 > Java > java教程 > 主體

05.Java 基礎 - 接口

黄舟
發布: 2017-02-27 10:21:56
原創
1778 人瀏覽過

基本概念

介面(interface),在軟體工程中,介面泛指供別人呼叫的方法或函數。它使抽象的概念更進一步。

在 Java 中透過關鍵字 interface 定義一個接口,透過關鍵字 implements 實作介面。

我們可以介面理解為是一個極度抽象的類,因為它比抽象類別更抽象。


實例探究

下面透過範例來看介面的特性:

  • ##定義一個接口

  • // 1.接口,访问权限只能是 默认(包访问权限)或 publicpublic interface Parent {
    
        // 2.成员变量,准确来说应该叫常量。具有以下特点:
    
        // 2.1.访问权限只能是 public (缺省也代表 public) ,修饰符只能是 final & static
        public final static String WORD = "a";    // 2.2.即使不指定,默认也是被 public fainl static 修饰
        String NAME = "b";    // 2.3.不能存在空的 final 变量 ,如 int num; 但是可以被非常量表达式初始化
        int num = new Random().nextInt(100);    // 3.抽象方法,访问权限只能是 默认(包访问权限)或 public
        public abstract void print();    abstract void print(int i);    // 4.普通方法,访问权限只能是 默认(包访问权限)或 public
        public void play();    void play(int i);
    }
    登入後複製
  • 實作一個介面

  • public class Son implements Parent {
        @Override
        public void print() {
            System.out.println("I am Son");
        }    @Override
        public void play() {
            System.out.println("Son is playing");
        }
    }
    登入後複製

巢狀介面

巢狀介面有兩種形式:

  • 在類別中定義一個介面;

  • 在介面中定義一個介面。


1.在類別中定義介面

介面嵌套在類別中,具有以下特點:

  • #介面的存取權限沒了限制,可以使用private 修飾

  • 方法/抽象方法/變數的存取權限與外部介面一致

下面透過實例來驗證:

public class Demo {
    // 内部接口
    private interface A {
        void f();
    }    // 内部类
    class AImpl implements A {        @Override
        public void f() {
            System.out.println("AImpl.f()");
        }
    }

    A getA(){        return new AImpl();
    }    private A a;    public void receive(A a){        this.a = a;
        a.f();
    }
}
登入後複製

再來看它的呼叫過程:

Demo demo = new Demo();// 错误,因为 A 是私有接口,不可被外部访问
// Demo.A a = demo.getA();  // 因为 A 接口不可视,所以只能通过内部类来访问
Demo.AImpl a = (Demo.AImpl) demo.getA();a.f();// 或者是这样
demo.receiveA(demo.getA());
登入後複製


2.在介面中定義介面

在接口中定義接口,除了呼叫之外,均於普通接口一致。

public interface Demo {
    // 内部接口
    interface A {        void play();
    }    void print();
}public class DemoImpl implements Demo,Demo.A{

    @Override
    public void play() {
        System.out.println("DemoImpl.play()");
    }    @Override
    public void print() {
        System.out.println("DemoImpl.print()");
    }

}public class Test{
    public static void main(String[] args) {        // 向上转型,只能调用 print()
        Demo demo  = new DemoImpl();        // 向上转型,只能调用 play() 
        Demo.A a = new DemoImpl();      
    }
}
登入後複製

介面&抽象類別

上面說過,我們可以把介面理解為是一個極度抽象的類,因為它比抽象類別更抽象。

在實際運用中,兩者還是有差別的。


1.語法差異

  • 抽象類別可以包含非抽象方法,而介面中只能存在抽象方法。

  • 抽象類別中的成員變數可以是各種類型的,而介面中的成員變數只能是

    公共的靜態常數(public static final)。

  • 抽象類別可以有靜態程式碼區塊和靜態方法,介面中不能含有靜態程式碼區塊以及靜態方法。

  • 一個類別只能繼承

    一個抽象類,而一個類別卻可以實作多個介面。


2.運用區別

#抽象類別是對事物整體(屬性,行為)的抽象,而介面是對事物局部(行為)的抽象化。

舉個簡單的例子,飛機和鳥是不同類的事物,但是它們都有一個共通性,就是都會飛。

在設計的時候,可以將飛機設計為一個類別 Airplane,並將鳥設計為一個類別 Bird。

但是不能將飛行這個特性也設計為類,因此它只是一個行為特性,並不是對一類事物的抽象描述。

此時可以將飛行 設計為一個介面 Fly,包含方法fly( ),然後 Airplane 和 Bird 分別依照自己的需求實作Fly 這個介面。

然後至於有不同種類的飛機,例如戰鬥機、民用飛機等直接繼承 Airplane 即可,對於鳥也是類似的,不同種類的鳥直接繼承 Bird 類即可。

從這裡可以看出,繼承是一個 「是不是」的關係,而介面實作則是 「有沒有」的關係。

如果一個類別繼承了某個抽象類,則子類別必定是抽象類別的種類,而介面實作則是有沒有、具備不具備的關係,例如鳥是否能飛(或是否具備飛行這個特性),能飛行則可以實現這個接口,不能飛行就不實現這個接口。

 以上就是05.Java 基礎 - 介面的內容,更多相關內容請關注PHP中文網(www.php.cn)!



#

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!