首頁(yè)技術(shù)文章正文

什么是抽象類?使用abstract格式修飾抽象方法

更新時(shí)間:2022-09-28 來(lái)源:黑馬程序員 瀏覽量:

父類中的方法,被它的子類們重寫,子類各自的實(shí)現(xiàn)都不盡相同。那么父類的方法聲明和方法主體,只有聲明還有意義,而方法主體則沒(méi)有存在的意義了(因?yàn)樽宇悓?duì)象會(huì)調(diào)用自己重寫的方法)。換句話說(shuō),父類可能知道子類應(yīng)該有哪個(gè)功能,但是功能具體怎么實(shí)現(xiàn)父類是不清楚的(由子類自己決定),父類只需要提供一個(gè)沒(méi)有方法體的定義即可,具體實(shí)現(xiàn)交給子類自己去實(shí)現(xiàn)。我們把沒(méi)有方法體的方法稱為抽象方法。Java語(yǔ)法規(guī)定,包含抽象方法的類就是抽象類。

抽象方法 : 沒(méi)有方法體的方法。

抽象類:包含抽象方法的類。

抽象方法和abstract

abstract是抽象的意思,用于修飾方法方法和類,修飾的方法是抽象方法,修飾的類是抽象類。

使用abstract關(guān)鍵字修飾方法,該方法就成了抽象方法,抽象方法只包含一個(gè)方法名,而沒(méi)有方法體,具體定義格式如下:

java
修飾符 abstract 返回值類型 方法名 (參數(shù)列表);

代碼舉例:

java
public abstract void run();

抽象類

如果一個(gè)類包含抽象方法,那么該類必須是抽象類。注意:抽象類不一定有抽象方法,但是有抽象方法的類必須定義成抽象類。

抽象類的定義格式如下:

java
abstract class 類名字 { 
  
}

代碼舉例:

java
public abstract class Animal {
    public abstract void run();
}

繼承抽象類的子類必須重寫父類所有的抽象方法。否則,該子類也必須聲明為抽象類。代碼舉例:

java
// 父類,抽象類
abstract class Employee {
    private String id;
    private String name;
    private double salary;
    
    public Employee() {
    }
    
    public Employee(String id, String name, double salary) {
        this.id = id;
        this.name = name;
        this.salary = salary;
    }
    
    // 抽象方法
    // 抽象方法必須要放在抽象類中
    abstract public void work();
}

// 定義一個(gè)子類繼承抽象類
class Manager extends Employee {
    public Manager() {
    }
    public Manager(String id, String name, double salary) {
        super(id, name, salary);
    }
    // 2.重寫父類的抽象方法
    @Override
    public void work() {
        System.out.println("管理其他人");
    }
}

// 定義一個(gè)子類繼承抽象類
class Cook extends Employee {
    public Cook() {
    }
    public Cook(String id, String name, double salary) {
        super(id, name, salary);
    }
    @Override
    public void work() {
        System.out.println("廚師炒菜多加點(diǎn)鹽...");
    }
}

// 測(cè)試類
public class Demo10 {
    public static void main(String[] args) {
        // 創(chuàng)建抽象類,抽象類不能創(chuàng)建對(duì)象
        // 假設(shè)抽象類讓我們創(chuàng)建對(duì)象,里面的抽象方法沒(méi)有方法體,無(wú)法執(zhí)行.所以不讓我們創(chuàng)建對(duì)象
//        Employee e = new Employee();
//        e.work();
        
        // 3.創(chuàng)建子類
        Manager m = new Manager();
        m.work();
        
        Cook c = new Cook("ap002", "庫(kù)克", 1);
        c.work();
    }
}

此時(shí)的方法重寫,是子類對(duì)父類抽象方法的完成實(shí)現(xiàn),我們將這種方法重寫的操作,也叫做實(shí)現(xiàn)方法。

抽象類的特征

抽象類的特征總結(jié)起來(lái)可以說(shuō)是有得有失

有得:抽象類得到了擁有抽象方法的能力。

有失:抽象類失去了創(chuàng)建對(duì)象的能力。

其他成員(構(gòu)造方法,實(shí)例方法,靜態(tài)方法等)抽象類都是具備的。

抽象類的細(xì)節(jié)

關(guān)于抽象類的使用,以下為語(yǔ)法上要注意的細(xì)節(jié),雖然條目較多,但若理解了抽象的本質(zhì),無(wú)需死記硬背。

1. 抽象類不能創(chuàng)建對(duì)象,如果創(chuàng)建,編譯無(wú)法通過(guò)而報(bào)錯(cuò)。只能創(chuàng)建其非抽象子類的對(duì)象。

假設(shè)創(chuàng)建了抽象類的對(duì)象,調(diào)用抽象的方法,而抽象方法沒(méi)有具體的方法體,沒(méi)有意義。

2. 抽象類中,可以有構(gòu)造方法,是供子類創(chuàng)建對(duì)象時(shí),初始化父類成員使用的。

子類的構(gòu)造方法中,有默認(rèn)的super(),需要訪問(wèn)父類構(gòu)造方法。

3. 抽象類中,不一定包含抽象方法,但是有抽象方法的類必定是抽象類。

未包含抽象方法的抽象類,目的就是不想讓調(diào)用者創(chuàng)建該類對(duì)象,通常用于某些特殊的類結(jié)構(gòu)設(shè)計(jì)。

4. 抽象類的子類,必須重寫抽象父類中所有的抽象方法,否則子類也必須定義成抽象類,編譯無(wú)法通過(guò)而報(bào)錯(cuò)。

假設(shè)不重寫所有抽象方法,則類中可能包含抽象方法。那么創(chuàng)建對(duì)象后,調(diào)用抽象的方法,沒(méi)有意義。

5. 抽象類存在的意義是為了被子類繼承。

抽象類中已經(jīng)實(shí)現(xiàn)的是模板中確定的成員,抽象類不確定如何實(shí)現(xiàn)的定義成抽象方法,交給具體的子類去實(shí)現(xiàn)。

抽象類存在的意義:抽象類存在的意義是為了被子類繼承,否則抽象類將毫無(wú)意義。抽象類可以強(qiáng)制讓子類,一定要按照規(guī)定的格式進(jìn)行重寫。





分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!