欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

從語(yǔ)法到實(shí)戰(zhàn)的全面剖析Java接口

 更新時(shí)間:2025年09月18日 10:47:02   作者:nice_lcj520  
在 Java 中,接口(interface)正是這樣一種公共規(guī)范:它定義了多個(gè)類(lèi)應(yīng)遵循的方法標(biāo)準(zhǔn),所有實(shí)現(xiàn)該接口的類(lèi)都必須按照標(biāo)準(zhǔn)實(shí)現(xiàn)這些方法,從而實(shí)現(xiàn) “通用” 的目的,這篇文章主要介紹了從語(yǔ)法到實(shí)戰(zhàn)的全面剖析Java接口,需要的朋友可以參考下

一、開(kāi)篇:接口是什么?—— 從生活到代碼的映射

在 Java 中,接口(interface)正是這樣一種公共規(guī)范:它定義了多個(gè)類(lèi)應(yīng)遵循的方法標(biāo)準(zhǔn),所有實(shí)現(xiàn)該接口的類(lèi)都必須按照標(biāo)準(zhǔn)實(shí)現(xiàn)這些方法,從而實(shí)現(xiàn) “通用” 的目的。簡(jiǎn)單說(shuō),接口是 “規(guī)定要做什么,不規(guī)定怎么做” 的抽象定義。

二、接口的基礎(chǔ)語(yǔ)法:定義與實(shí)現(xiàn)

2.1 如何定義一個(gè)接口?

接口的定義與類(lèi)類(lèi)似,但使用interface關(guān)鍵字,內(nèi)部主要包含抽象方法(默認(rèn)無(wú)需實(shí)現(xiàn))。語(yǔ)法格式如下:

public interface 接口名稱(chēng) {
    // 抽象方法(以下四種寫(xiě)法等價(jià),推薦第四種,更簡(jiǎn)潔)
    public abstract void method1(); 
    public void method2();
    abstract void method3();
    void method4(); // 推薦:默認(rèn)被public abstract修飾
}

命名規(guī)范(重要?。?/p>

  • 接口名通常以大寫(xiě)字母I開(kāi)頭(如IRunning、ISwimming);
  • 名稱(chēng)多使用形容詞(體現(xiàn) “具備某種特性”,如 “可運(yùn)行的”“可游泳的”);
  • 阿里編碼規(guī)范要求:接口中的方法和屬性不加修飾符,保持簡(jiǎn)潔。

2.2 如何實(shí)現(xiàn)接口?

接口不能直接使用,必須通過(guò) “實(shí)現(xiàn)類(lèi)” 實(shí)現(xiàn)它,語(yǔ)法上使用implements關(guān)鍵字,且必須重寫(xiě)接口中所有的抽象方法。

示例:以 “USB 接口” 為例,定義接口并實(shí)現(xiàn)

// 定義USB接口(規(guī)范:打開(kāi)設(shè)備、關(guān)閉設(shè)備)
public interface USB {
    void openDevice(); // 打開(kāi)設(shè)備
    void closeDevice(); // 關(guān)閉設(shè)備
}
// 鼠標(biāo)類(lèi)實(shí)現(xiàn)USB接口
public class Mouse implements USB {
    @Override
    public void openDevice() {
        System.out.println("打開(kāi)鼠標(biāo)"); // 具體實(shí)現(xiàn)
    }
    @Override
    public void closeDevice() {
        System.out.println("關(guān)閉鼠標(biāo)"); // 具體實(shí)現(xiàn)
    }
    // 鼠標(biāo)特有方法
    public void click() {
        System.out.println("鼠標(biāo)點(diǎn)擊");
    }
}
// 鍵盤(pán)類(lèi)實(shí)現(xiàn)USB接口
public class KeyBoard implements USB {
    @Override
    public void openDevice() {
        System.out.println("打開(kāi)鍵盤(pán)");
    }
    @Override
    public void closeDevice() {
        System.out.println("關(guān)閉鍵盤(pán)");
    }
    // 鍵盤(pán)特有方法
    public void inPut() {
        System.out.println("鍵盤(pán)輸入");
    }
}

關(guān)鍵說(shuō)明

  • 實(shí)現(xiàn)類(lèi)與接口的關(guān)系是 “實(shí)現(xiàn)”(implements),區(qū)別于類(lèi)與類(lèi)的 “繼承”(extends);
  • 若實(shí)現(xiàn)類(lèi)未重寫(xiě)接口中所有抽象方法,則該類(lèi)必須定義為抽象類(lèi)。

三、接口的核心特性:9 個(gè)必須掌握的細(xì)節(jié)

接口的特性是理解其設(shè)計(jì)思想的關(guān)鍵,以下結(jié)合代碼示例逐個(gè)解析:

3.1 接口不能直接實(shí)例化對(duì)象

接口是 “規(guī)范” 而非 “具體實(shí)現(xiàn)”,因此不能像普通類(lèi)一樣創(chuàng)建對(duì)象,否則編譯報(bào)錯(cuò):

public class Test {
    public static void main(String[] args) {
        USB usb = new USB(); // 編譯錯(cuò)誤:USB是抽象的,無(wú)法實(shí)例化
    }
}

3.2 接口中的方法默認(rèn)是 public abstract

接口中的所有方法都會(huì)被隱式指定為public abstract,若添加其他修飾符(如private)會(huì)報(bào)錯(cuò):

public interface USB {
    private void openDevice(); // 編譯錯(cuò)誤:接口方法不能用private修飾
}

3.3 接口中的方法不能在接口內(nèi)實(shí)現(xiàn)

接口只定義 “做什么”,不定義 “怎么做”,因此方法不能有方法體,否則編譯報(bào)錯(cuò):

public interface USB {
    void closeDevice() { 
        System.out.println("關(guān)閉設(shè)備"); // 編譯錯(cuò)誤:接口方法不能有主體
    }
}

3.4 重寫(xiě)接口方法時(shí),訪(fǎng)問(wèn)權(quán)限必須是 public

接口方法默認(rèn)是public,重寫(xiě)時(shí)不能降低訪(fǎng)問(wèn)權(quán)限(如用默認(rèn)權(quán)限或private):

public class Mouse implements USB {
    @Override
    void openDevice() { // 編譯錯(cuò)誤:試圖分配更低的訪(fǎng)問(wèn)權(quán)限(應(yīng)為public)
        System.out.println("打開(kāi)鼠標(biāo)");
    }
}

3.5 接口中的變量默認(rèn)是 public static final(常量)

接口中定義的變量會(huì)被隱式指定為 “公開(kāi)、靜態(tài)、 final”,即常量,必須初始化且不能修改:

public interface USB {
    double VERSION = 3.0; // 等價(jià)于:public static final double VERSION = 3.0;
}
public class Test {
    public static void main(String[] args) {
        System.out.println(USB.VERSION); // 可通過(guò)接口名直接訪(fǎng)問(wèn)(靜態(tài)特性)
        USB.VERSION = 2.0; // 編譯錯(cuò)誤:final變量不能修改
    }
}

3.6 接口中沒(méi)有構(gòu)造方法和靜態(tài)代碼塊

接口不是類(lèi),因此不能定義構(gòu)造方法(用于初始化對(duì)象)或靜態(tài)代碼塊(用于初始化類(lèi)):

public interface USB {
    public USB() {} // 編譯錯(cuò)誤:接口不能有構(gòu)造方法
    static { // 編譯錯(cuò)誤:接口不能有靜態(tài)代碼塊
        System.out.println("初始化");
    }
}

3.7 接口編譯后也是.class 文件

盡管接口不是類(lèi),但編譯后會(huì)生成后綴為.class的字節(jié)碼文件,與類(lèi)的編譯結(jié)果一致。

3.8 一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口(解決單繼承限制)

Java 中類(lèi)與類(lèi)是單繼承(一個(gè)類(lèi)只能有一個(gè)父類(lèi)),但類(lèi)與接口是多實(shí)現(xiàn)(一個(gè)類(lèi)可實(shí)現(xiàn)多個(gè)接口),這是接口的核心優(yōu)勢(shì)之一。

示例:青蛙既會(huì)跑又會(huì)游,實(shí)現(xiàn)兩個(gè)接口

// 定義“會(huì)跑”接口
interface IRunning {
    void run();
}
// 定義“會(huì)游”接口
interface ISwimming {
    void swim();
}
// 青蛙類(lèi)實(shí)現(xiàn)兩個(gè)接口
class Frog implements IRunning, ISwimming {
    @Override
    public void run() {
        System.out.println("青蛙往前跳");
    }
    @Override
    public void swim() {
        System.out.println("青蛙蹬腿游泳");
    }
}

3.9 接口之間可以多繼承

接口與接口之間可以通過(guò)extends實(shí)現(xiàn)多繼承,合并多個(gè)接口的方法規(guī)范:

// 接口IRunning和ISwimming
interface IRunning { void run(); }
interface ISwimming { void swim(); }
// 接口IAmphibious繼承上述兩個(gè)接口(合并規(guī)范)
interface IAmphibious extends IRunning, ISwimming {}
// 實(shí)現(xiàn)IAmphibious接口,需重寫(xiě)run()和swim()
class Frog implements IAmphibious {
    @Override
    public void run() { ... }
    @Override
    public void swim() { ... }
}

四、接口的實(shí)戰(zhàn)場(chǎng)景:從理論到應(yīng)用

4.1 表示類(lèi)的 “特性” 而非 “本質(zhì)”

類(lèi)的繼承關(guān)系體現(xiàn) “is-a”(是什么),如 “貓是動(dòng)物”;接口體現(xiàn) “has-a”(具備什么特性),如 “貓具備會(huì)跑的特性”。

示例:用接口定義動(dòng)物的特性

// 動(dòng)物類(lèi)(本質(zhì))
class Animal {
    protected String name;
    public Animal(String name) { this.name = name; }
}
// 特性接口
interface IRunning { void run(); }
interface IFlying { void fly(); }
interface ISwimming { void swim(); }
// 貓:是動(dòng)物,具備會(huì)跑特性
class Cat extends Animal implements IRunning {
    public Cat(String name) { super(name); }
    @Override
    public void run() {
        System.out.println(name + "用四條腿跑");
    }
}
// 鴨子:是動(dòng)物,具備會(huì)跑、會(huì)游、會(huì)飛特性
class Duck extends Animal implements IRunning, ISwimming, IFlying {
    public Duck(String name) { super(name); }
    @Override
    public void run() { ... }
    @Override
    public void swim() { ... }
    @Override
    public void fly() { ... }
}

4.2 利用多態(tài)實(shí)現(xiàn)靈活調(diào)用

接口作為引用類(lèi)型,可接收所有實(shí)現(xiàn)類(lèi)的對(duì)象,實(shí)現(xiàn) “同一方法,不同行為” 的多態(tài)效果。

示例:用接口參數(shù)實(shí)現(xiàn)通用方法

// 定義“散步”方法,參數(shù)為“會(huì)跑”的對(duì)象
public static void walk(IRunning runner) {
    System.out.println("帶著伙伴散步");
    runner.run(); // 調(diào)用實(shí)現(xiàn)類(lèi)的run()
}
// 測(cè)試:傳入不同實(shí)現(xiàn)類(lèi)
public static void main(String[] args) {
    Cat cat = new Cat("小貓");
    Frog frog = new Frog("小青蛙");
    Robot robot = new Robot("機(jī)器人"); 
    walk(cat);    // 輸出:小貓用四條腿跑
    walk(frog);   // 輸出:青蛙往前跳
    walk(robot);  // 輸出:機(jī)器人用輪子跑
}

4.3 實(shí)現(xiàn)對(duì)象排序(Comparable 接口)

Java 內(nèi)置的Comparable接口可用于定義對(duì)象的比較規(guī)則,配合Arrays.sort()實(shí)現(xiàn)排序。

示例:對(duì)學(xué)生對(duì)象按分?jǐn)?shù)排序

// 學(xué)生類(lèi)實(shí)現(xiàn)Comparable接口
class Student implements Comparable {
    private String name;
    private int score;
    // 構(gòu)造方法、toString()省略
    @Override
    public int compareTo(Object o) {
        Student s = (Student) o;
        // 按分?jǐn)?shù)降序:當(dāng)前分?jǐn)?shù)高則返回-1(排在前面)
        if (this.score > s.score) return -1;
        if (this.score < s.score) return 1;
        return 0;
    }
}
// 測(cè)試排序
public class Test {
    public static void main(String[] args) {
        Student[] students = {
            new Student("張三", 95),
            new Student("李四", 96),
            new Student("王五", 97)
        };
        Arrays.sort(students); // 基于compareTo()排序
        System.out.println(Arrays.toString(students)); 
        // 輸出:[王五:97, 李四:96, 張三:95]
    }
}

4.4 對(duì)象拷貝(Clonable 接口)

Clonable接口是 Java 內(nèi)置的標(biāo)記接口(無(wú)抽象方法),用于標(biāo)識(shí)類(lèi)可以調(diào)用clone()方法實(shí)現(xiàn)對(duì)象拷貝。

示例:實(shí)現(xiàn)對(duì)象克隆

class Animal implements Clonable {
    private String name;
    @Override
    public Animal clone() {
        try {
            return (Animal) super.clone(); // 調(diào)用父類(lèi)clone()
        } catch (CloneNotSupportedException e) {
            return null;
        }
    }
}
// 測(cè)試
public class Test {
    public static void main(String[] args) {
        Animal a1 = new Animal();
        Animal a2 = a1.clone();
        System.out.println(a1 == a2); // 輸出:false(不同對(duì)象)
    }
}

注意clone()默認(rèn)是淺拷貝(僅拷貝對(duì)象本身,對(duì)象中的引用類(lèi)型字段仍指向原地址),深拷貝需手動(dòng)實(shí)現(xiàn)。

五、接口與抽象類(lèi)的區(qū)別(面試高頻)

對(duì)比維度抽象類(lèi)(abstract class)接口(interface)
定義關(guān)鍵字abstract classinterface
核心作用作為父類(lèi),封裝子類(lèi)共有的屬性和方法定義規(guī)范,標(biāo)識(shí)類(lèi)的額外特性
方法類(lèi)型可包含普通方法(有實(shí)現(xiàn))和抽象方法全為抽象方法(JDK8 前);可含 default 方法(JDK8 后)
變量類(lèi)型可包含任意權(quán)限的變量只能是 public static final 常量
子類(lèi)關(guān)系extends繼承(單繼承)implements實(shí)現(xiàn)(多實(shí)現(xiàn))
構(gòu)造方法有構(gòu)造方法(供子類(lèi)初始化父類(lèi))無(wú)構(gòu)造方法
繼承關(guān)系可實(shí)現(xiàn)多個(gè)接口可繼承多個(gè)接口

六、總結(jié):接口的核心價(jià)值

  1. 規(guī)范統(tǒng)一:強(qiáng)制實(shí)現(xiàn)類(lèi)遵循同一標(biāo)準(zhǔn),降低協(xié)作成本;
  2. 解耦靈活:類(lèi)的使用者只需關(guān)注接口(“具備什么能力”),無(wú)需關(guān)注具體實(shí)現(xiàn);
  3. 突破限制:通過(guò)多實(shí)現(xiàn)和接口多繼承,彌補(bǔ) Java 單繼承的不足;
  4. 多態(tài)基礎(chǔ):基于接口的多態(tài)是 Java 靈活設(shè)計(jì)的核心(如 “依賴(lài)倒置” 原則)。

到此這篇關(guān)于從語(yǔ)法到實(shí)戰(zhàn)的全面剖析Java接口的文章就介紹到這了,更多相關(guān)Java接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaWeb文件上傳流程

    JavaWeb文件上傳流程

    這篇文章主要介紹了JavaWeb文件上傳流程,JavaWeb中最重要的技術(shù)之一,下文關(guān)于其文件上傳的流程分享,需要的小伙伴可以參考一下
    2022-05-05
  • MyBatis limit分頁(yè)設(shè)置的實(shí)現(xiàn)

    MyBatis limit分頁(yè)設(shè)置的實(shí)現(xiàn)

    這篇文章主要介紹了MyBatis limit分頁(yè)設(shè)置的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Mybatis?Mapper中多參數(shù)方法不使用@param注解報(bào)錯(cuò)的解決

    Mybatis?Mapper中多參數(shù)方法不使用@param注解報(bào)錯(cuò)的解決

    這篇文章主要介紹了Mybatis?Mapper中多參數(shù)方法不使用@param注解報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • 如何在springBoot下搭建日志框架

    如何在springBoot下搭建日志框架

    這篇文章主要介紹了如何在springBoot下搭建日志框架,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 關(guān)于@Autowierd && @Resource 你真的了解嗎

    關(guān)于@Autowierd && @Resource 你真的了解嗎

    這篇文章主要介紹了關(guān)于@Autowierd && @Resource的具體使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring中的@ControllerAdvice三種用法詳解

    Spring中的@ControllerAdvice三種用法詳解

    這篇文章主要介紹了Spring中的@ControllerAdvice三種用法詳解,加了@ControllerAdvice的類(lèi)為那些聲明了(@ExceptionHandler、@InitBinder或@ModelAttribute注解修飾的)方法的類(lèi)而提供的<BR>專(zhuān)業(yè)化的@Component,以供多個(gè)Controller類(lèi)所共享,需要的朋友可以參考下
    2024-01-01
  • mybatis-plus中BaseMapper入門(mén)使用

    mybatis-plus中BaseMapper入門(mén)使用

    本文主要介紹了mybatis-plus中BaseMapper入門(mén)使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • MyBatis-Plus分頁(yè)插件不生效的解決方法

    MyBatis-Plus分頁(yè)插件不生效的解決方法

    這篇文章主要介紹了MyBatis-Plus分頁(yè)插件不生效的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Idea如何查看Maven依賴(lài)樹(shù)

    Idea如何查看Maven依賴(lài)樹(shù)

    這篇文章主要介紹了Idea如何查看Maven依賴(lài)樹(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Springboot詳解RocketMQ實(shí)現(xiàn)廣播消息流程

    Springboot詳解RocketMQ實(shí)現(xiàn)廣播消息流程

    RocketMQ作為一款純java、分布式、隊(duì)列模型的開(kāi)源消息中間件,支持事務(wù)消息、順序消息、批量消息、定時(shí)消息、消息回溯等,本篇我們了解如何實(shí)現(xiàn)廣播消息
    2022-06-06

最新評(píng)論