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

詳解Java抽象類與普通類的區(qū)別

 更新時(shí)間:2021年06月13日 09:10:52   作者:Lf_MrF  
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著Java抽象類與普通類的區(qū)別展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下

淺談抽象類

在面向?qū)ο蟾拍钪?所有的對(duì)象都是通過類來描述的,但是反過來,并不是所有的類都是用來描述對(duì)象的.如果一個(gè)類中沒有足夠多的信息來描述一個(gè)具體的對(duì)象,這樣的類就是抽象類。

看到這里可能還是覺得有些難以理解,舉個(gè)例子說明一下:說到動(dòng)物你會(huì)想到什么?貓,狗,雞鴨鵝?當(dāng)然這些都可以.那么動(dòng)物這兩個(gè)字,你能確定一個(gè)具體的對(duì)象嗎?顯然不能.甚至更嚴(yán)格意義上講,說到貓你會(huì)想到什么?橘貓,短美…

畢竟:

一千個(gè)人心中有一千個(gè)哈姆雷喵.

所以我們?cè)谠O(shè)計(jì)中,動(dòng)物類可以設(shè)計(jì)成為抽象類,而某一種特定的物種可以采用通過繼承動(dòng)物類實(shí)現(xiàn).

多態(tài)這部分我理解了好久,有一天突然就會(huì)用了,也明白所謂的父類引用指向子類對(duì)象是什么意思了.但是寫完前面發(fā)現(xiàn),自己明白了講出來還是很模糊.多態(tài)真的是很重要很重要的一個(gè)點(diǎn),要好好體會(huì)這部分.

抽象類和普通類的區(qū)別是什么?

抽象類的語法規(guī)則

抽象類的語法規(guī)則:abstract關(guān)鍵字修飾

1.抽象類不可以被實(shí)例化.

2.抽象類不定有抽象方法.

3.一個(gè)類中如果有抽象方法,那么這個(gè)類一定是抽象類.

4.抽象類中可以存在普通屬性、方法、靜態(tài)屬性和靜態(tài)方法.

5.抽象類中可以存在構(gòu)造方法.

public abstract class AbstractObject{
	// 普通屬性
    String name;
	// 構(gòu)造方法
    public AbstractObject(String name) {
        this.name = name;
    }
    // 靜態(tài)方法 - 類名訪問
    public static void staticMethod(){
        System.out.println("抽象類可以有靜態(tài)方法.");
    }
	// 抽象方法
    public abstract void move();
	// 普通方法
    public void commonMethod(String food){
        System.out.println("抽象類可以有普通方法.");
    }
}

抽象類不可以實(shí)例化

這部分可以直接暫時(shí)記住結(jié)論,整個(gè)過程可以暫時(shí)先跳過后面補(bǔ),按照我的學(xué)習(xí)經(jīng)歷(基礎(chǔ)差到爆),這部分直接看會(huì)很懵.

定義一個(gè)動(dòng)物的抽象類,動(dòng)物總得動(dòng)吧(并不!)所以定義一個(gè)共性的move()方法.

public abstract class Animal {
    String name;
    public Animal(String name) {
        this.name = name;
    }
    public abstract void move();
}

當(dāng)我使用IDEA寫示例的時(shí)候直接出現(xiàn)了第二種情況!見鬼了抽象類new出來了!

public class Test {
    public static void main(String[] args) {
    	// 抽象類不能實(shí)例化!會(huì)直接報(bào)編譯期錯(cuò)誤!
        //標(biāo)紅信息: 'Animal' is abstract; cannot be instantiated
        Animal animal = new Animal("小貓");
        // 第二種情況
        Animal animalObjcet = new Animal("小貓") {
            @Override
            public void move() {
                System.out.println("我開始移動(dòng)了!");
            }
        };
    }
}

關(guān)于第二種情況的解釋 - 擴(kuò)展知識(shí):匿名內(nèi)部類(可跳過)

這里涉及到了一個(gè)知識(shí)點(diǎn)叫做匿名內(nèi)部類.
匿名內(nèi)部類的格式如下:

new 類名或者接口名(){
	重寫方法;
}
// 放到一起對(duì)比看,很明顯后面的是一個(gè)匿名內(nèi)部類
new Animal("小貓") {
    @Override
    public void move() {
        System.out.println("我開始移動(dòng)了!");
    }
};

匿名:這個(gè)類沒有名字
內(nèi)部類:存在于某個(gè)類的內(nèi)部的類.

它實(shí)際上是繼承并實(shí)現(xiàn)了Animal抽象類的一個(gè)子類.也就是說這里并不是實(shí)例化出了Animal類,這個(gè)簡(jiǎn)便的寫法相當(dāng)于我們進(jìn)行了如下的寫法.

public class AnimalObject extends Animal{
    public AnimalObject(String name) {
        super(name);
    }
    @Override
    public void move() {
        System.out.println("我是一只能動(dòng)的動(dòng)物!");
    }
}

public class Test {
    public static void main(String[] args) {
        AnimalObject animalObject = new AnimalObject("我是動(dòng)物抽象類的子類");
        animalObjcet.move();	// 我是一只能動(dòng)的動(dòng)物!
    }
}

抽象類的子類

注意:這里有一個(gè)需要強(qiáng)調(diào)的地方,對(duì)于抽象類中的方法我們的用詞應(yīng)該是實(shí)現(xiàn).對(duì)于已經(jīng)實(shí)現(xiàn)了的方法,我們的用詞才可以是重寫.寫到后面發(fā)現(xiàn)了前面描述過程中我用詞都是重寫這里進(jìn)行了修正.
錯(cuò)誤寫法:不重寫(Override)抽象類中的抽象方法
正確寫法:不實(shí)現(xiàn)(Implement)抽象類中的抽象方法
再次補(bǔ)充:好像說成重寫也不能算錯(cuò)誤,IDEA自動(dòng)生成的里面也加了 @Override 注解.就不繼續(xù)修改了.

1.不實(shí)現(xiàn)抽象類中的抽象方法

當(dāng)不對(duì)抽象類中的抽象方法進(jìn)行重寫的時(shí)候,子類一定也是抽象類.(有抽象方法的類一定是抽象類)

public abstract class AbstractCat extends Animal{
    Integer weight;
    public AbstractCat(String name, Integer weight) {
        super(name);    // 繼承父類的名稱
        this.weight = weight; // 貓咪的年齡
    }
    // 這個(gè)是沒有重寫,依舊是了抽象方法
    public abstract void move();
    // 注意:下面這種寫法是重寫過之后的!只是方法體為空.
    // public void move(){};
}

2.實(shí)現(xiàn)抽象類中的抽象方法

當(dāng)對(duì)抽象類中的所有抽象方法進(jìn)行實(shí)現(xiàn)之后,現(xiàn)在的貓咪類可以是一個(gè)普通類了.

public class Cat extends AbstractCat{
    public Cat(String name, Integer weight) {
        super(name, weight);
    }
    @Override
    public void move() {
        System.out.println("一只奔跑的重達(dá)" + weight + "kg的" + name);
    }
}

測(cè)試一下:

public class Test {
    public static void main(String[] args) {
        Cat cat = new Cat("橘貓", 20);
        cat.move();	// 一只奔跑的重達(dá)20kg的橘貓
    }
}

好了到這里,屬于你的橘貓終于跑起來了!

關(guān)于實(shí)現(xiàn)抽象方法的延伸

我看很多文章都說要子類要重寫(重寫是錯(cuò)誤的!這里更正為實(shí)現(xiàn))父類的抽象方法,抽象方法.那我如果只實(shí)現(xiàn)部分抽象方法呢?
第一步:改造Animal類

public abstract class Animal {
    String name;
    public Animal(String name) {
        System.out.println("我是動(dòng)物的構(gòu)造方法!");
        this.name = name;
    }
    // 多添加幾個(gè)抽象方法
    public abstract void move();
    public abstract void eat();
    public abstract void sleep();
}

第二步:AbstractCat 類中實(shí)現(xiàn)部分抽象方法

// 不添加 abstract 關(guān)鍵字會(huì)報(bào)錯(cuò)
// Class 'AbstractCat' must either be declared abstract or implement abstract method 'move()' in 'Animal'
public abstract class AbstractCat extends Animal{
    Integer weight;
    public AbstractCat(String name, Integer weight) {
        super(name);
        System.out.println("我是抽象貓咪的構(gòu)造方法!");
        // 繼承父類的名稱
        this.weight = weight; // 貓咪的年齡
    }
    @Override
    public void eat() {
        System.out.println(this.name + "在吃貓糧");
    }
    @Override
    public void sleep() {
        System.out.println(this.name + "睡覺了!");
    }
}

第三步:Cat類登場(chǎng)

public class Cat extends AbstractCat{

    public Cat(String name, Integer weight) {
        super(name, weight);
    }
    /*
    sleep方法和eat方法已經(jīng)在父類中實(shí)現(xiàn)過了,所以這里只剩下最后一個(gè) move 是需要實(shí)現(xiàn)的抽象方法.
	*/
    @Override
    public void move() {
        System.out.println("重達(dá)" + weight + "kg的" + this.name + "在懶洋洋的跑");
    }
}

小結(jié)

1.普通類可以實(shí)例化調(diào)用,但是抽象類不可以,因?yàn)槌橄箢愔皇且环N概念,無法映射為具體的對(duì)象.

2.普通類和抽象類都可以被繼承,但是抽象類被繼承之后,子類需要重寫抽象類中的全部抽象方法,否則子類必須是一個(gè)抽象類.

參考和擴(kuò)展閱讀

Java基礎(chǔ)系列第一彈之方法重載和方法重寫的區(qū)別
Java基礎(chǔ)系列第二彈之Java多態(tài)成員訪問的特點(diǎn)
Java基礎(chǔ)系列第三彈之操作字符串的類都有哪些?區(qū)別是什么?

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

相關(guān)文章

  • java反射機(jī)制示例

    java反射機(jī)制示例

    這篇文章主要介紹了java反射機(jī)制示例,需要的朋友可以參考下
    2014-04-04
  • 9種Java單例模式詳解(推薦)

    9種Java單例模式詳解(推薦)

    這篇文章主要介紹了9種Java單例模式詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • idea中項(xiàng)目前端網(wǎng)頁圖標(biāo)不顯示的原因及解決

    idea中項(xiàng)目前端網(wǎng)頁圖標(biāo)不顯示的原因及解決

    這篇文章主要介紹了idea中項(xiàng)目前端網(wǎng)頁圖標(biāo)不顯示的原因及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java編程實(shí)現(xiàn)五子棋人人對(duì)戰(zhàn)代碼示例

    Java編程實(shí)現(xiàn)五子棋人人對(duì)戰(zhàn)代碼示例

    這篇文章主要介紹了Java編程實(shí)現(xiàn)五子棋人人對(duì)戰(zhàn)代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-11-11
  • SpringBoot獲取Request對(duì)象的幾種方法

    SpringBoot獲取Request對(duì)象的幾種方法

    HttpServletRequest 簡(jiǎn)稱 Request,它是一個(gè) Servlet API 提供的對(duì)象,用于獲取客戶端發(fā)起的 HTTP 請(qǐng)求信息,那么問題來了,在 Spring Boot 中,獲取 Request 對(duì)象的方法有哪些?所以本文給大家介紹了SpringBoot獲取Request對(duì)象的幾種方法,需要的朋友可以參考下
    2024-11-11
  • Java未賦值變量的初始值解析(默認(rèn)值)

    Java未賦值變量的初始值解析(默認(rèn)值)

    這篇文章主要介紹了Java未賦值變量的初始值(默認(rèn)值),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring Boot中Bean定義方調(diào)用方式解析

    Spring Boot中Bean定義方調(diào)用方式解析

    這篇文章主要介紹了Spring Boot中Bean定義方調(diào)用方式解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 關(guān)于LinkedList集合對(duì)元素進(jìn)行增查刪操作

    關(guān)于LinkedList集合對(duì)元素進(jìn)行增查刪操作

    LinkedList集合內(nèi)部包含有兩個(gè)Node類型的first和last屬性維護(hù)一個(gè)雙向循環(huán)鏈表,在鏈表中的每一個(gè)元素都使用引用的方式來記住它的前一個(gè)元素和后一個(gè)元素,從而可以將所有的元素彼此連接起來,需要的朋友可以參考下
    2023-04-04
  • Java中jqGrid 學(xué)習(xí)筆記整理——進(jìn)階篇(二)

    Java中jqGrid 學(xué)習(xí)筆記整理——進(jìn)階篇(二)

    這篇文章主要介紹了Java中jqGrid 學(xué)習(xí)筆記整理——進(jìn)階篇(二)的相關(guān)資料,需要的朋友可以參考下
    2016-04-04
  • java中如何判斷對(duì)象是否是垃圾

    java中如何判斷對(duì)象是否是垃圾

    這篇文章主要介紹了java中如何判斷對(duì)象是否是垃圾,Java有兩種算法判斷對(duì)象是否是垃圾:引用計(jì)數(shù)算法和可達(dá)性分析算法,需要的朋友可以參考下
    2023-04-04

最新評(píng)論

雅安市| 封开县| 嘉兴市| 江城| 太仓市| 武城县| 河北区| 承德县| 财经| 波密县| 开远市| 定陶县| 息烽县| 灵璧县| 漠河县| 囊谦县| 玛纳斯县| 获嘉县| 喜德县| 阆中市| 故城县| 蕉岭县| 建德市| 东平县| 桓台县| 汶川县| 吴桥县| 都昌县| 常州市| 虞城县| 永兴县| 揭西县| 准格尔旗| 忻城县| 伊宁县| 鹰潭市| 敦煌市| 汨罗市| 兰考县| 锦州市| 马公市|