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

Java 抽象類詳解

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

一、抽象類的基本定義

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

1. 語(yǔ)法格式

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

2. 關(guān)鍵特征

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

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

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

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

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

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

  • 子類必須實(shí)現(xiàn)抽象類中所有的抽象方法,否則子類必須也聲明為抽象類(用abstract修飾)。
  • 示例:
// 抽象父類
abstract class Animal {
    // 抽象方法:所有動(dòng)物都必須實(shí)現(xiàn)“吃”的行為
    abstract void eat();
    // 普通方法:所有動(dòng)物共有的“睡覺”行為
    void sleep() {
        System.out.println("動(dòng)物睡覺");
    }
}
// 子類Dog:非抽象類,必須實(shí)現(xiàn)eat()
class Dog extends Animal {
    @Override
    void eat() { // 實(shí)現(xiàn)抽象方法
        System.out.println("狗吃骨頭");
    }
}
// 子類Bird:若不實(shí)現(xiàn)eat(),則必須聲明為抽象類
abstract class Bird extends Animal {
    // 未實(shí)現(xiàn)eat(),因此Bird必須是抽象類
}
  • 子類實(shí)現(xiàn)抽象方法時(shí),訪問權(quán)限不能低于父類。
  • 例如:父類抽象方法為protected void eat(),子類實(shí)現(xiàn)時(shí)不能用private(可?protectedpublic)。
  • 抽象類的構(gòu)造方法
  • 抽象類可以有構(gòu)造方法(用于初始化自身成員變量),但不能直接調(diào)用(因無法實(shí)例化)。子類實(shí)例化時(shí),會(huì)先調(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 + "汽車行駛");
    }
}
// 測(cè)試
public class Test {
    public static void main(String[] args) {
        Car car = new Car("寶馬"); // 子類實(shí)例化時(shí),先調(diào)用Vehicle的構(gòu)造方法
        car.drive(); // 輸出:寶馬汽車行駛
    }
}

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

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

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

示例:何時(shí)用抽象類,何時(shí)用接口?

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

五、抽象類的使用場(chǎng)景

抽象類適合以下場(chǎng)景:

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

六、注意事項(xiàng)

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

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

相關(guān)文章

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

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

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

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

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

    Spring中的EurekaServer啟動(dòng)詳解

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

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

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

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

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

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

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

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

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

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

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

    javax.validation.constraints注解使用

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

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

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

最新評(píng)論

麻阳| 泗阳县| 郴州市| 含山县| 中牟县| 永顺县| 福鼎市| 大埔区| 枝江市| 珠海市| 宣城市| 托克托县| 南漳县| 东乡县| 奉贤区| 锡林郭勒盟| 通州区| 汉源县| 光山县| 景德镇市| 宜宾市| 永嘉县| 易门县| 称多县| 吉水县| 航空| 高青县| 运城市| 鲜城| 理塘县| 曲周县| 潍坊市| 宜黄县| 太谷县| 云南省| 绥芬河市| 确山县| 治县。| 拜城县| 新乐市| 乐亭县|