最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 抽象類詳解

 更新時間:2026年03月18日 09:15:47   作者:數(shù)據(jù)與人文  
抽象類是用abstract關(guān)鍵字修飾的類,其核心作用是作為父類提供通用模板,同時強(qiáng)制子類實現(xiàn)特定方法,本文介紹Java 抽象類的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧

一、抽象類的基本定義

抽象類是用abstract關(guān)鍵字修飾的類,其核心作用是作為父類提供通用模板,同時強(qiáng)制子類實現(xiàn)特定方法。

1. 語法格式

// 定義抽象類
abstract class 類名 {
    // 成員變量
    // 構(gòu)造方法(抽象類可以有構(gòu)造方法)
    // 具體方法(有方法體)
    // 抽象方法(無方法體,用abstract修飾)
    abstract 返回值類型 方法名(參數(shù)列表);
}

2. 關(guān)鍵特征

  • 不能實例化:抽象類無法通過new關(guān)鍵字創(chuàng)建對象(編譯報錯),只能作為父類被繼承。
  • 可包含抽象方法:抽象方法是沒有方法體的方法(用abstract修飾),必須由子類實現(xiàn)。
  • 可包含普通成員:抽象類可以有成員變量、構(gòu)造方法、普通方法(有實現(xiàn))、靜態(tài)方法等,與普通類的區(qū)別僅在于 “可包含抽象方法” 和 “不能實例化”。

二、抽象方法的規(guī)則

抽象方法是抽象類的核心組成部分,它定義了子類必須實現(xiàn)的 “規(guī)范”,其聲明有嚴(yán)格規(guī)則:

  • 必須用abstract修飾,且沒有方法體(不寫{},直接用;結(jié)束)。
    • 示例:abstract void run();(正確);abstract void run() {}(錯誤,不能有方法體)。
  • 不能被private、finalstatic修飾:
    • private:抽象方法需要被子類重寫,private會阻止子類訪問,矛盾。
    • finalfinal方法不能被重寫,而抽象方法必須被重寫,矛盾。
    • staticstatic方法屬于類,無法被實例方法重寫(子類的靜態(tài)方法不能重寫父類的靜態(tài)方法)。
  • 抽象類中可以沒有抽象方法,但有抽象方法的類必須是抽象類。
  • (若一個類包含抽象方法卻不用abstract修飾,編譯報錯)。

三、抽象類與子類的關(guān)系

子類繼承抽象類時,必須遵循以下規(guī)則:

  • 子類必須實現(xiàn)抽象類中所有的抽象方法,否則子類必須也聲明為抽象類(用abstract修飾)。
  • 示例:
// 抽象父類
abstract class Animal {
    // 抽象方法:所有動物都必須實現(xiàn)“吃”的行為
    abstract void eat();
    // 普通方法:所有動物共有的“睡覺”行為
    void sleep() {
        System.out.println("動物睡覺");
    }
}
// 子類Dog:非抽象類,必須實現(xiàn)eat()
class Dog extends Animal {
    @Override
    void eat() { // 實現(xiàn)抽象方法
        System.out.println("狗吃骨頭");
    }
}
// 子類Bird:若不實現(xiàn)eat(),則必須聲明為抽象類
abstract class Bird extends Animal {
    // 未實現(xiàn)eat(),因此Bird必須是抽象類
}
  • 子類實現(xiàn)抽象方法時,訪問權(quán)限不能低于父類。
  • 例如:父類抽象方法為protected void eat(),子類實現(xiàn)時不能用private(可?protectedpublic)。
  • 抽象類的構(gòu)造方法
  • 抽象類可以有構(gòu)造方法(用于初始化自身成員變量),但不能直接調(diào)用(因無法實例化)。子類實例化時,會先調(diào)用抽象父類的構(gòu)造方法(遵循 “先父后子” 的初始化順序)。

示例:

abstract class Vehicle {
    protected String brand;
    // 抽象類的構(gòu)造方法
    public Vehicle(String brand) {
        this.brand = brand;
    }
    abstract void drive();
}
class Car extends Vehicle {
    public Car(String brand) {
        super(brand); // 調(diào)用父類構(gòu)造方法
    }
    @Override
    void drive() {
        System.out.println(brand + "汽車行駛");
    }
}
// 測試
public class Test {
    public static void main(String[] args) {
        Car car = new Car("寶馬"); // 子類實例化時,先調(diào)用Vehicle的構(gòu)造方法
        car.drive(); // 輸出:寶馬汽車行駛
    }
}

四、抽象類 vs 接口:核心區(qū)別

抽象類和接口(Interface)都能定義規(guī)范,但在設(shè)計目的和使用場景上有本質(zhì)區(qū)別:

維度抽象類(Abstract Class)接口(Interface)
繼承關(guān)系單繼承(子類只能繼承一個抽象類)多實現(xiàn)(類可以實現(xiàn)多個接口)
方法類型可包含抽象方法、普通方法、靜態(tài)方法、默認(rèn)方法Java 8 前:只能有抽象方法;Java 8 后:可包含默認(rèn)方法(default)、靜態(tài)方法
成員變量可包含各種修飾符的成員變量(private、protected、public等)只能是public static final修飾的常量(默認(rèn),可省略)
構(gòu)造方法有構(gòu)造方法(供子類調(diào)用)無構(gòu)造方法
設(shè)計目的體現(xiàn) “is-a” 關(guān)系(繼承共性),強(qiáng)調(diào)代碼復(fù)用體現(xiàn) “like-a” 關(guān)系(實現(xiàn)能力),強(qiáng)調(diào)行為規(guī)范

示例:何時用抽象類,何時用接口?

  • 若需要為一組相關(guān)類提供通用實現(xiàn)(如Animal類的sleep()方法),同時強(qiáng)制子類實現(xiàn)特定行為(如eat()),用抽象類
  • 若需要定義一組不相關(guān)類的共同行為(如Flyable接口,讓BirdPlane都能實現(xiàn) “飛”),用接口

五、抽象類的使用場景

抽象類適合以下場景:

  • 提取共性,減少重復(fù)代碼:當(dāng)多個子類有相同的方法實現(xiàn)時,將這些實現(xiàn)放在抽象父類中,子類只需關(guān)注自身特有的實現(xiàn)。
  • 例如:Shape抽象類定義通用的getColor()方法,子類Circle、Rectangle只需實現(xiàn)getArea()(面積計算因形狀而異)。
  • 定義模板方法:通過 “模板方法模式”,在抽象類中定義算法骨架,將可變步驟延遲到子類實現(xiàn)。
  • 示例:
// 抽象類:定義泡茶/泡咖啡的通用流程
abstract class Beverage {
    // 模板方法:固定流程(不能被重寫)
    public final void prepare() {
        boilWater();    // 共性步驟:燒水
        brew();         // 抽象步驟:沖泡(子類實現(xiàn))
        pourInCup();    // 共性步驟:倒入杯子
        addCondiments();// 抽象步驟:加調(diào)料(子類實現(xiàn))
    }
    // 抽象方法:子類實現(xiàn)具體沖泡方式
    abstract void brew();
    // 抽象方法:子類實現(xiàn)具體加調(diào)料方式
    abstract void addCondiments();
    // 共性方法:燒水
    void boilWater() {
        System.out.println("燒開水");
    }
    // 共性方法:倒入杯子
    void pourInCup() {
        System.out.println("倒入杯子");
    }
}
// 子類:咖啡
class Coffee extends Beverage {
    @Override
    void brew() {
        System.out.println("沖泡咖啡粉");
    }
    @Override
    void addCondiments() {
        System.out.println("加牛奶和糖");
    }
}
  • 限制實例化:當(dāng)某個類僅作為父類存在(無需實例化),用抽象類阻止其被new創(chuàng)建。

六、注意事項

  1. 抽象類不能用final修飾:final類不能被繼承,而抽象類必須被繼承才能使用,二者矛盾。
  2. 抽象類可以繼承普通類或抽象類:抽象類的父類可以是普通類(如abstract class A extends B,B是普通類)。
  3. 抽象類可以實現(xiàn)接口:抽象類實現(xiàn)接口時,無需實現(xiàn)接口的抽象方法(可延遲到子類實現(xiàn))。

到此這篇關(guān)于Java 抽象類詳解的文章就介紹到這了,更多相關(guān)Java 抽象類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • resty的緩存技術(shù)設(shè)計及使用

    resty的緩存技術(shù)設(shè)計及使用

    這篇文章主要為大家介紹了resty緩存技術(shù)的設(shè)計及使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • Java兩種動態(tài)代理JDK動態(tài)代理和CGLIB動態(tài)代理詳解

    Java兩種動態(tài)代理JDK動態(tài)代理和CGLIB動態(tài)代理詳解

    這篇文章主要介紹了Java兩種動態(tài)代理JDK動態(tài)代理和CGLIB動態(tài)代理詳解,代理模式是23種設(shè)計模式的一種,他是指一個對象A通過持有另一個對象B,可以具有B同樣的行為的模式,為了對外開放協(xié)議,B往往實現(xiàn)了一個接口,A也會去實現(xiàn)接口,需要的朋友可以參考下
    2023-11-11
  • Spring中的EurekaServer啟動詳解

    Spring中的EurekaServer啟動詳解

    這篇文章主要介紹了Spring中的EurekaServer啟動詳解,初始化eureka,包含eureka集群的同步和發(fā)布注冊,這個方法時重寫ServletContextListener#contextInitialized,是eureka啟動的入口了,需要的朋友可以參考下
    2023-11-11
  • JAVA實現(xiàn)億級千萬級數(shù)據(jù)順序?qū)С龅氖纠a

    JAVA實現(xiàn)億級千萬級數(shù)據(jù)順序?qū)С龅氖纠a

    本文主要介紹了JAVA實現(xiàn)億級千萬級數(shù)據(jù)順序?qū)С龅氖纠a,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-08-08
  • Java通過MyBatis框架對MySQL數(shù)據(jù)進(jìn)行增刪查改的基本方法

    Java通過MyBatis框架對MySQL數(shù)據(jù)進(jìn)行增刪查改的基本方法

    MyBatis框架由Java的JDBC API進(jìn)一步封裝而來,在操作數(shù)據(jù)庫方面效果拔群,接下來我們就一起來看看Java通過MyBatis框架對MySQL數(shù)據(jù)進(jìn)行增刪查改的基本方法:
    2016-06-06
  • Java調(diào)用Shell命令的方法

    Java調(diào)用Shell命令的方法

    這篇文章主要介紹了Java調(diào)用Shell命令的方法,實例分析了java調(diào)用shell命令的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • Java封裝、繼承、多態(tài)三大特征的理解

    Java封裝、繼承、多態(tài)三大特征的理解

    封裝、繼承、多態(tài)三大特征是java中比較常用的,務(wù)必要掌握,下面給大家介紹Java封裝、繼承、多態(tài)三大特征的理解,有不清楚的朋友可以一起學(xué)習(xí)下
    2016-06-06
  • SpringBoot使用ShardingSphere-Proxy的實現(xiàn)示例

    SpringBoot使用ShardingSphere-Proxy的實現(xiàn)示例

    ShardingSphere-Proxy是一個獨(dú)立的數(shù)據(jù)庫代理層,可以與SpringBoot集成,本文介紹了SpringBoot使用ShardingSphere-Proxy的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • javax.validation.constraints注解使用

    javax.validation.constraints注解使用

    這篇文章主要介紹了javax.validation.constraints注解使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • springboot?sleuth?日志跟蹤問題記錄

    springboot?sleuth?日志跟蹤問題記錄

    Spring?Cloud?Sleuth是一個在應(yīng)用中實現(xiàn)日志跟蹤的強(qiáng)有力的工具,使用Sleuth庫可以應(yīng)用于計劃任務(wù)?、多線程服務(wù)或復(fù)雜的Web請求,尤其是在一個由多個服務(wù)組成的系統(tǒng)中,這篇文章主要介紹了springboot?sleuth?日志跟蹤,需要的朋友可以參考下
    2023-07-07

最新評論

宁德市| 通江县| 漳州市| 元朗区| 台东市| 伊吾县| 乐亭县| 伊吾县| 青浦区| 冕宁县| 志丹县| 新泰市| 会理县| 山阴县| 光泽县| 株洲县| 博客| 清河县| 姜堰市| 明水县| 龙山县| 荔浦县| 曲麻莱县| 牟定县| 隆化县| 嵊州市| 新沂市| 沙湾县| 区。| 郴州市| 东莞市| 建始县| 林州市| 岳西县| 河源市| 万源市| 邯郸县| 公安县| 齐齐哈尔市| 黑水县| 长汀县|