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

java?抽象類(lèi)示例詳解

 更新時(shí)間:2024年12月13日 14:45:43   作者:Cyan_RA9  
我們將“只有方法聲明,沒(méi)有方法體”的一類(lèi)方法統(tǒng)稱(chēng)為抽象方法,抽象方法用關(guān)鍵字abstract修飾,本文介紹java?抽象類(lèi)示例詳解,感興趣的朋友跟隨小編一起看看吧

一、抽象類(lèi)概述:

我們知道,類(lèi)用來(lái)模擬現(xiàn)實(shí)事物。一個(gè)類(lèi)可以模擬一類(lèi)事物,而某個(gè)類(lèi)的一個(gè)實(shí)例化對(duì)象可以模擬某個(gè)屬于該類(lèi)的具體的事物。類(lèi)中描繪了該類(lèi)所有對(duì)象共同的特性,當(dāng)一個(gè)類(lèi)中給出的信息足夠全面時(shí),我們就可以實(shí)例化該類(lèi);比方說(shuō),在Dog類(lèi)中定義了name,age,fur_color,sex等屬性,以及habit,eat等行為時(shí),我們就可以創(chuàng)建一個(gè)Dog類(lèi)對(duì)象,來(lái)模擬某個(gè)具體的Dog,比如你家的寵物狗,或者是神犬小七等。但是,當(dāng)一個(gè)類(lèi)中給出的信息不夠全面時(shí),(比方說(shuō)有無(wú)法確定的行為),它給出的信息不足以描繪出一個(gè)具體的對(duì)象,這時(shí)我們往往不會(huì)實(shí)例化該類(lèi),這種類(lèi)就是抽象類(lèi)。打個(gè)比方,對(duì)于Animal類(lèi),是,所有的動(dòng)物都有吃喝的行為,定義eat方法可以描述動(dòng)物“吃”這一行為,但是每種動(dòng)物吃的都不一樣,因此一個(gè)eat方法并不能準(zhǔn)確描述吃什么,怎么吃。這時(shí)Animal給出的信息就不足夠描述一個(gè)對(duì)象,我們就不能去實(shí)例化Animal類(lèi)。
在Java中,我們通過(guò)在類(lèi)前添加關(guān)鍵字abstract(抽象的)來(lái)定義抽象類(lèi)。如下所示 :

public abstract class Animal {
    //Animal類(lèi)此時(shí)就是一個(gè)抽象類(lèi)。
}
class Dog extends Animal {
    //Dog類(lèi)繼承了Animal類(lèi),是Animal類(lèi)的子類(lèi)。
}

二、抽象方法 :

1.概述 :

我們將“只有方法聲明,沒(méi)有方法體”的一類(lèi)方法統(tǒng)稱(chēng)為抽象方法,抽象方法用關(guān)鍵字abstract修飾。需要注意的是,如果一個(gè)方法已經(jīng)確定是抽象方法,那么它絕不能再有方法體,即不能出現(xiàn)大括號(hào),而是只需要在()后面添加一個(gè)分號(hào)即可,否則IDEA會(huì)提示報(bào)錯(cuò)信息,如下圖所示 :

還要注意一點(diǎn),如果某個(gè)類(lèi)中已經(jīng)出現(xiàn)了抽象方法,那這個(gè)類(lèi)必須定義成抽象類(lèi),否則會(huì)報(bào)錯(cuò),如下GIF動(dòng)圖演示——我們刪掉Animal類(lèi)前的abstract修飾符,IDEA立馬就會(huì)給出提示信息,如下 :

也就是說(shuō),擁有抽象方法的類(lèi)一定是抽象類(lèi);但是抽象類(lèi)不一定有抽象方法。

2.應(yīng)用 :

當(dāng)父類(lèi)需要定義一個(gè)方法,卻不能明確該方法的具體實(shí)現(xiàn)細(xì)節(jié)時(shí),可以將該方法定義為abstract,具體實(shí)現(xiàn)細(xì)節(jié)延遲到子類(lèi)。(讓子類(lèi)重寫(xiě)這個(gè)方法)
就比如我們剛才說(shuō)的——Animal類(lèi)中的eat() 方法,我們可以先將其定義為抽象方法,然后在子類(lèi)中,比如說(shuō)Dog類(lèi)中重寫(xiě)eat() 方法,給出對(duì)Dog類(lèi)對(duì)象“吃”這一行為的一些具體描述。
up以Animal類(lèi),Dog類(lèi)和Test類(lèi)為例,代碼如下 :

package knowledge.polymorphism.about_abstract.introduction;
public abstract class Animal {   /** 父類(lèi) */
    //將Animal類(lèi)中的eat() 方法定義為抽象類(lèi),具體實(shí)現(xiàn)延遲到子類(lèi)。
    public abstract void eat();
}
class Dog extends Animal {      /** 子類(lèi) */
    //子類(lèi)重寫(xiě)父類(lèi)的抽象方法,也稱(chēng)為子類(lèi)實(shí)現(xiàn)了該抽象方法。
    public void eat() {
        System.out.println("狗是雜食性動(dòng)物,喜食肉類(lèi),喂養(yǎng)時(shí)應(yīng)該以動(dòng)物蛋白為主,素食為輔。");
    }
}
class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat();
    }
}

運(yùn)行結(jié)果 :

3.特點(diǎn) :

若父類(lèi)中定義了一個(gè)抽象方法,要求其所有非抽象子類(lèi)都必須重寫(xiě)該抽象方法。否則IDEA會(huì)報(bào)錯(cuò),如下圖所示 :

前面我們說(shuō)了,抽象方法用abstract關(guān)鍵字修飾。這里再補(bǔ)充一點(diǎn)——抽象方法不能再使用private,final 或者static關(guān)鍵字來(lái)修飾,即abstract不能與private,final或static共同出現(xiàn),這是因?yàn)槎x抽象方法的目的就是想將方法的具體實(shí)現(xiàn)延遲到子類(lèi),最終是要被子類(lèi)重寫(xiě)的,而private,final,static這幾個(gè)關(guān)鍵字都和“方法重寫(xiě)”的目的背道而馳。
如果你固執(zhí)己見(jiàn),非要讓abstract和這幾個(gè)關(guān)鍵字一同出現(xiàn),IDEA也是毫不客氣,直接報(bào)錯(cuò),如下圖所示 :

三、抽象類(lèi)特點(diǎn) :

1.關(guān)于abstract關(guān)鍵字 :

abstract關(guān)鍵字只能用于修飾類(lèi)和方法,用于聲明抽象類(lèi)和抽象方法。其中,抽象類(lèi)必須使用abstract關(guān)鍵字修飾。聲明時(shí)格式如下 :

訪(fǎng)問(wèn)權(quán)限修飾符 abstract class 類(lèi)名{ // }

訪(fǎng)問(wèn)權(quán)限修飾符 abstract 返回值類(lèi)型 方法名(形參列表);

舉個(gè)例子,如下 :

//抽象類(lèi)
public abstract class Animal {
    //抽象方法
    public abstract void eat();        //抽象方法最后加一個(gè)分號(hào)即可,不可以有大括號(hào)。
}

2.抽象類(lèi)不能被實(shí)例化,只能創(chuàng)建其子類(lèi)對(duì)象 :

即,我們不能創(chuàng)建抽象類(lèi)對(duì)象(這里的對(duì)象指的是堆空間中真正的對(duì)象,即不能“new 抽象類(lèi)”),原因我們?cè)陂_(kāi)篇抽象類(lèi)的概述中也提到了,這里不再贅述。如果你頭鐵,非要?jiǎng)?chuàng)建抽象類(lèi)對(duì)象,IDEA也不是吃素的,直接報(bào)錯(cuò),如下圖所示 :

當(dāng)然,如果抽象類(lèi)的子類(lèi)沒(méi)有用abstract關(guān)鍵字修飾,那么我們可以創(chuàng)建其子類(lèi)對(duì)象,如下圖所示 :

3.抽象類(lèi)子類(lèi)的兩個(gè)選擇 :

如果某個(gè)類(lèi)繼承了一個(gè)抽象類(lèi),那么這個(gè)類(lèi)有兩個(gè)選擇——要么實(shí)現(xiàn)父類(lèi)所有的抽象方法,要么子類(lèi)本身也定義成抽象類(lèi)。當(dāng)然,肯定也不會(huì)是瞎jb想定義成抽象類(lèi)就定義成抽象類(lèi)的??,要滿(mǎn)足我們我們上面所說(shuō)的定義抽象類(lèi)的條件——類(lèi)中提供的信息不足以描述一個(gè)對(duì)象,或者類(lèi)中有無(wú)法確定的行為需要延遲到子類(lèi)實(shí)現(xiàn)。

還是給大家舉個(gè)栗子。up現(xiàn)在在character包下創(chuàng)建一個(gè)Food類(lèi),將Food類(lèi)定義為抽象類(lèi),并定義showNutrition()抽象方法,該方法將來(lái)要打印出食物的主要營(yíng)養(yǎng),具體實(shí)現(xiàn)延遲到子類(lèi);然后分別創(chuàng)建子類(lèi)Meat類(lèi)和Fruit類(lèi)去繼承Food類(lèi),我們在Meat類(lèi)中重寫(xiě)Food類(lèi)的showNutrition() 方法,使其打印出肉類(lèi)的主要營(yíng)養(yǎng)價(jià)值;同時(shí),另一個(gè)子類(lèi)Fruit類(lèi)不去實(shí)現(xiàn)showNutrition() 方法,而是將其定義為抽象類(lèi)。最后,以Test類(lèi)為測(cè)試類(lèi),在測(cè)試類(lèi)中創(chuàng)建子類(lèi)對(duì)象并調(diào)用showNutrition() 方法。
Food類(lèi),Meat類(lèi),F(xiàn)ruit類(lèi),Test類(lèi)代碼如下 :

package knowledge.polymorphism.about_abstract.character;
public abstract class Food {            /** 父類(lèi) : Food類(lèi) */
    //記住,抽象方法沒(méi)有方法體
    public abstract void showNutrition();
}
class Meat extends Food {               /** 子類(lèi) : Meat類(lèi) */
    @Override
    public void showNutrition() {
        System.out.println("肉類(lèi)是蛋白質(zhì)、脂肪、維生素B2、維生素B1、煙酸和鐵的重要來(lái)源。");
    }
}
abstract class Fruit extends Food {     /** 子類(lèi) : Fruit類(lèi) */
}
class Test {                            /** 測(cè)試類(lèi) : Test類(lèi) */
    public static void main(String[] args) {
        Meat meat = new Meat();
        meat.showNutrition();
    }
}

運(yùn)行結(jié)果 :

我們也可以再定義一個(gè)CiLi類(lèi)表示水果中的刺梨,然后讓刺梨類(lèi)去繼承Fruit類(lèi),并在CiLi類(lèi)中去實(shí)現(xiàn)showNutrition() 方法;Fruit類(lèi)不變,Test類(lèi)和CiLi類(lèi)代碼如下 :

class CiLi extends Fruit {
    @Override
    public void showNutrition() {
        System.out.println("刺梨是當(dāng)之無(wú)愧的水果界的VC之王,VC含量高達(dá)2585mg/100g!");
    }
}
class Test {
    public static void main(String[] args) {/** 測(cè)試類(lèi) : Test類(lèi) */
        Meat meat = new Meat();
        meat.showNutrition();
        System.out.println("----------------------------------------");
        CiLi ciLi = new CiLi();
        ciLi.showNutrition();
    }
}

運(yùn)行結(jié)果 :

四、抽象類(lèi)的成員 :

1.成員變量 :

抽象類(lèi)既可以有靜態(tài)的成員變量,也可以有非靜態(tài)的成員變量
既可以有靜態(tài)的成員常量,也可以有非靜態(tài)的成員常量。

2.成員方法 :

抽象類(lèi)既可以有(非私有的)抽象方法(注意抽象方法一定是非私有非靜態(tài)非final,因?yàn)閍bstract關(guān)鍵字與private關(guān)鍵字,static關(guān)鍵字,final關(guān)鍵字不能同時(shí)存在);

也可以有非抽象方法(非抽象方法就可以用private,final和static關(guān)鍵字來(lái)修飾了,具體使用時(shí),根據(jù)實(shí)際需求合理應(yīng)用)。

3.構(gòu)造器 :

抽象類(lèi)可以和非抽象類(lèi)一樣擁有構(gòu)造器,并且支持構(gòu)造器的重載。

4.總結(jié) :

其實(shí)吧,說(shuō)上面一大堆都是廢話(huà)??。

抽象類(lèi)中的成員只比非抽象類(lèi)多一種——抽象方法。其他都和非抽象類(lèi)一樣。

大家只要記住抽象方法怎么寫(xiě),怎么用就彳亍了。??

5.代碼演示 :

up以Fruit類(lèi)為演示類(lèi),代碼如下 :

package knowledge.polymorphism.about_abstract.about_members;
public abstract class Fruit {        //Fruit類(lèi)是抽象類(lèi)
//抽象類(lèi)中可定義的成員:
    //1.非靜態(tài)變量和靜態(tài)變量
    private String name = "水果名兒是有長(zhǎng)有短";
    private static String size = "水果的大小是有大有小";
    //2.非靜態(tài)常量和靜態(tài)常量
    public final String COLOR = "水果的顏色是五光十色";
    public static final String FORM = "水果的形態(tài)是千奇百怪";
    //3.抽象方法和非抽象方法
    public abstract void nutrition();
    private final static void suitCrowds() {
        System.out.println("人人都適合吃水果!");
    }
    public void invokeSuitCrowds() {
        Fruit.suitCrowds();
    }
    //4.構(gòu)造器可以重載
    public Fruit() {
        System.out.println("Fruit's name = " + name);
    }
    public Fruit(String name) {
        this.name = name;
    }
}

這些成員都可以在抽象類(lèi)中定義,只要語(yǔ)法正確,IDEA是不會(huì)報(bào)錯(cuò)的,當(dāng)然,具體怎么使用這些成員就看你自己了,根據(jù)實(shí)際情況來(lái)定。 (PS : 2024--2--17補(bǔ)充一點(diǎn)——其實(shí)不太建議大家吃水果)

五、抽象類(lèi)課堂練習(xí) :

1.要求 :

如上圖所示 :

已知西風(fēng)騎士團(tuán)的三位騎士分別是琴,可莉和優(yōu)菈,請(qǐng)分別定義類(lèi)來(lái)描述它們,要求給出每一個(gè)西風(fēng)騎士的姓名,年齡和性別;并且,這三人均可以使用元素之力,分別是元素戰(zhàn)技和元素爆發(fā),但每位騎士的戰(zhàn)技和爆發(fā)都不一樣。其中,琴使用風(fēng)元素,元素戰(zhàn)技為風(fēng)壓箭,元素爆發(fā)為蒲公英之風(fēng);可莉使用火元素,元素戰(zhàn)技為蹦蹦炸彈,元素爆發(fā)為轟轟火花;優(yōu)菈使用冰元素,元素戰(zhàn)技為冰朝的渦旋,元素爆發(fā)為凝浪之光劍。請(qǐng)?jiān)谶@些類(lèi)中正確選擇一個(gè)類(lèi)定義成抽象類(lèi),并在該類(lèi)中定義抽象方法elemental_kill() 和 elemental_burst(),要求這兩個(gè)抽象方法將來(lái)在實(shí)現(xiàn)時(shí),需要在控制臺(tái)打印出當(dāng)前騎士的元素戰(zhàn)技和元素爆發(fā);并在該抽象類(lèi)中定義非抽象方法,要求該方法可以在控制臺(tái)打印出當(dāng)前騎士的基本信息。

2.思路 :

閱讀提干后我們得知,總共有三個(gè)角色,這三個(gè)角色均屬于名為“西風(fēng)騎士團(tuán)”的一個(gè)組織。因此,我們可以分別定義四個(gè)類(lèi)來(lái)分別描述“西風(fēng)騎士團(tuán)”,“琴”,“可莉”,“優(yōu)菈”,再加上測(cè)試類(lèi),因此我們總共需要定義五個(gè)類(lèi)。
“西風(fēng)騎士團(tuán)”可以代表一類(lèi)人,由于每位騎士的元素戰(zhàn)技和元素爆發(fā)均不相同,這個(gè)類(lèi)并不能提供足夠的信息來(lái)描述一個(gè)具體的“騎士”對(duì)象。所以,我們可以定義Knights類(lèi)來(lái)表示“西風(fēng)騎士團(tuán)”,并將其定義為抽象類(lèi)。又因?yàn)榍伲衫?,?yōu)菈均屬于西風(fēng)騎士團(tuán)的一員,因此我們可以分別定義Qin類(lèi),Keli類(lèi)以及Youla類(lèi)來(lái)描述這三位騎士,并讓Qin類(lèi),Keli類(lèi)和Youla類(lèi)繼承Knights類(lèi)。
題干要求定義兩個(gè)抽象方法elemental_kill() 和 elemental_burst()來(lái)分別打印出當(dāng)前騎士的元素戰(zhàn)技和元素爆發(fā)。既然我們已經(jīng)確定Knights類(lèi)為抽象類(lèi),這就沒(méi)啥好說(shuō)了,在Knights類(lèi)中定義這兩個(gè)方法即可。
又因?yàn)轭}干還要求我們?cè)诔橄箢?lèi)中定義方法打印出當(dāng)前騎士的基本信息,因此,我們可以在Knights類(lèi)定義name,age,sex這些屬性;根據(jù)JavaBean標(biāo)準(zhǔn),我們需要將這些屬性全部設(shè)為私有,并給出公共的訪(fǎng)問(wèn)這些屬性的方法,然后給出Knights類(lèi)的無(wú)參構(gòu)造和帶參構(gòu)造(注意,Knights是抽象類(lèi),無(wú)法被實(shí)例化,因此我們給出Knights構(gòu)造器的目的不是為了創(chuàng)建Knights類(lèi)對(duì)象,而是為了在子類(lèi)的帶參構(gòu)造中使用super語(yǔ)句調(diào)用父類(lèi)構(gòu)造器;接著,再定義一個(gè)printInfo方法,用于打印出當(dāng)前騎士的姓名,年齡和性別。
最后,我們可以定義測(cè)試類(lèi)Test類(lèi),并分別創(chuàng)建Qin類(lèi),Keli類(lèi)和Youla類(lèi)對(duì)象,調(diào)用elemental_kill()方法,elemental_burst() 方法,以及printInfo方法

3.代碼 :

代碼如下 :

package knowledge.polymorphism.about_abstract.exercise;
public abstract class Knights {             /** 騎士類(lèi) */
    private String name;
    private int age;
    private String sex;
    public Knights() {
    }
    public Knights(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public abstract void elemental_skill();
    public abstract void elemental_burst();
    public void printInfo() {
        System.out.println("西風(fēng)騎士——" + getName() + "," + getAge() + "歲,性別" + getSex());
    }
}
class Qin extends Knights{                  /** 琴類(lèi) */
    public Qin(String name, int age, String sex) {
        super(name, age, sex);
    }
    @Override
    public void elemental_skill() {
        System.out.println("琴的元素戰(zhàn)技是風(fēng)壓箭。");
    }
    @Override
    public void elemental_burst() {
        System.out.println("琴的元素戰(zhàn)技是蒲公英之風(fēng)。");
    }
}
class Keli extends Knights{                 /** 可莉類(lèi) */
    public Keli(String name, int age, String sex) {
        super(name, age, sex);
    }
    @Override
    public void elemental_skill() {
        System.out.println("可莉的元素戰(zhàn)技是蹦蹦炸彈。");
    }
    @Override
    public void elemental_burst() {
        System.out.println("可莉的元素戰(zhàn)技是轟轟火花。");
    }
}
class Youla extends Knights{                /** 優(yōu)菈類(lèi) */
    public Youla(String name, int age, String sex) {
        super(name, age, sex);
    }
    @Override
    public void elemental_skill() {
        System.out.println("優(yōu)菈的元素戰(zhàn)技是冰朝的渦旋。");
    }
    @Override
    public void elemental_burst() {
        System.out.println("優(yōu)菈的元素戰(zhàn)技是凝浪之光劍。");
    }
}
class Test {                                /** 測(cè)試類(lèi) */
    public static void main(String[] args) {
        Qin qin = new Qin("琴", 22, "female");
        qin.elemental_skill();
        qin.elemental_burst();
        qin.printInfo();
        System.out.println("-------------------------------------------");
        Keli keli = new Keli("可莉", 500, "female");
        keli.elemental_skill();
        keli.elemental_burst();
        keli.printInfo();
        System.out.println("-------------------------------------------");
        Youla youla = new Youla("優(yōu)菈", 21, "female");
        youla.elemental_skill();
        youla.elemental_burst();
        youla.printInfo();
    }
}

運(yùn)行結(jié)果 :

六、總結(jié) :

??,以上就是本節(jié)抽象類(lèi)相關(guān)的全部?jī)?nèi)容了,大家一定要牢記抽象類(lèi)和抽象方法的特點(diǎn),牢記抽象類(lèi)和抽象方法之間的關(guān)系,掌握abstract關(guān)鍵字的使用。下一節(jié)內(nèi)容是多態(tài)篇章的final關(guān)鍵字,我們不見(jiàn)不散??。感謝閱讀!

System.out.println("END--------------------------------------------------------------------------------");

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

相關(guān)文章

最新評(píng)論

新竹县| 大连市| 崇左市| 云林县| 子洲县| 神木县| 玉树县| 子长县| 额济纳旗| 安图县| 宝兴县| 英德市| 贵南县| 尖扎县| 博罗县| 白朗县| 彭阳县| 陕西省| 蕲春县| 陆川县| 噶尔县| 丰城市| 忻州市| 富宁县| 齐齐哈尔市| 兰州市| 连南| 东台市| 岳普湖县| 叙永县| 闻喜县| 紫金县| 社会| 那曲县| 溧阳市| 新乐市| 合肥市| 资中县| 萨嘎县| 新野县| 万州区|