搜尋
首頁Javajava教程05.Java 基礎 - 接口

05.Java 基礎 - 接口

Feb 27, 2017 am 10:21 AM

基本概念

介面(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)!



#

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
JVM如何促進Java的'寫作一次,在任何地方運行”(WORA)功能?JVM如何促進Java的'寫作一次,在任何地方運行”(WORA)功能?May 02, 2025 am 12:25 AM

JVM通過字節碼解釋、平台無關的API和動態類加載實現Java的WORA特性:1.字節碼被解釋為機器碼,確保跨平台運行;2.標準API抽像操作系統差異;3.類在運行時動態加載,保證一致性。

Java的較新版本如何解決平台特定問題?Java的較新版本如何解決平台特定問題?May 02, 2025 am 12:18 AM

Java的最新版本通過JVM優化、標準庫改進和第三方庫支持有效解決平台特定問題。 1)JVM優化,如Java11的ZGC提升了垃圾回收性能。 2)標準庫改進,如Java9的模塊系統減少平台相關問題。 3)第三方庫提供平台優化版本,如OpenCV。

說明JVM執行的字節碼驗證的過程。說明JVM執行的字節碼驗證的過程。May 02, 2025 am 12:18 AM

JVM的字節碼驗證過程包括四個關鍵步驟:1)檢查類文件格式是否符合規範,2)驗證字節碼指令的有效性和正確性,3)進行數據流分析確保類型安全,4)平衡驗證的徹底性與性能。通過這些步驟,JVM確保只有安全、正確的字節碼被執行,從而保護程序的完整性和安全性。

平台獨立性如何簡化Java應用程序的部署?平台獨立性如何簡化Java應用程序的部署?May 02, 2025 am 12:15 AM

Java'splatFormIndepentEncealLowsApplicationStorunonAnyOperatingsystemwithajvm.1)singleCodeBase:writeandeandcompileonceforallplatforms.2)easileupdates:updatebybytecodeforsimultanane deployment.3)testOnOneOnePlatForforurouniverSalpeforuluniverSalpehavior formafforulululyiversalivernave.444.44.444

Java的平台獨立性如何隨著時間的流逝而發展?Java的平台獨立性如何隨著時間的流逝而發展?May 02, 2025 am 12:12 AM

Java的平台獨立性通過JVM、JIT編譯、標準化、泛型、lambda表達式和ProjectPanama等技術不斷增強。自1990年代以來,Java從基本的JVM演進到高性能的現代JVM,確保了代碼在不同平台的一致性和高效性。

在Java應用程序中緩解平台特定問題的策略是什麼?在Java應用程序中緩解平台特定問題的策略是什麼?May 01, 2025 am 12:20 AM

Java如何緩解平台特定的問題? Java通過JVM和標準庫來實現平台無關性。 1)使用字節碼和JVM抽像操作系統差異;2)標準庫提供跨平台API,如Paths類處理文件路徑,Charset類處理字符編碼;3)實際項目中使用配置文件和多平台測試來優化和調試。

Java的平台獨立性與微服務體系結構之間有什麼關係?Java的平台獨立性與微服務體系結構之間有什麼關係?May 01, 2025 am 12:16 AM

java'splatformentenceenhancesenhancesmicroservicesharchitecture byferingDeploymentFlexible,一致性,可伸縮性和便攜性。 1)DeploymentFlexibilityAllowsibilityAllowsOllowsOllowSorlowsOllowsOllowsOllowSeStorunonAnyPlatformwithajvM.2)penterencyCrossServAccAcrossServAcrossServiCessImplifififiesDeevelopmentandeDe

GRAALVM與Java的平台獨立目標有何關係?GRAALVM與Java的平台獨立目標有何關係?May 01, 2025 am 12:14 AM

GraalVM通過三種方式增強了Java的平台獨立性:1.跨語言互操作,允許Java與其他語言無縫互操作;2.獨立的運行時環境,通過GraalVMNativeImage將Java程序編譯成本地可執行文件;3.性能優化,Graal編譯器生成高效的機器碼,提升Java程序的性能和一致性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具