如何完全理解Java抽象類 爲何要用抽象類 什麼狀況下用抽象類

  如何完全理解Java抽象類 爲何要用抽象類 什麼狀況下用抽象類 html

  吶,到底什麼是抽象類,有時明明一個普通類就能夠解決了,爲啥非得整個抽象類,裝逼嗎java

  我曾帶着這樣的疑惑,查了不少資料,看了不少源碼,寫了不少代碼,如下是自家的理解ide

 1、完全理解Java抽象類 學習

  當咱們沒法理解一個事物的時候,我得追尋他的本源:萬物皆對象spa

  在面向對象的概念中,世間萬物經過類來描繪的,但若是一個類中沒有包含足夠的信息來描繪一個具體的事物對象,這樣的類就是抽象類。(參考 https://www.runoob.com/java/java-abstraction.html)設計

  不管你在其餘渠道看到過多少關於抽象類的解釋,都沒有這樣解釋合乎根本!code

  舉個栗子htm

  (豬狗牛羊鳥器車 的例子就不要看了,都是一些教科書上沒有任何實操意義的例子,看了你最終也不明白是啥玩意兒)對象

  讓你設計一個簡單的學生選課系統blog

  基本需求:學生選課,老師授課,每一個老師只能接受有限個個學生,每一個學生只能選一個老師。

  最終會抽象出其中2個領域對象:學生、老師。當咱們用類去描述學生、老師時,他們的共性是人(Person):有名字、年齡、職業等特徵,有上課(學習、授課都屬於上課)等行爲;

public abstract class Person {
    protected String name;
    protected int age;
    protected int profession;

    public abstract void goToClass();
}

   吶,咱們想一想,光有這些特性、行爲,就能完整的描述出一個可在選課系統,操做的對象(學生或老師)嗎?顯然不行!學生(Student)還須要:所選課程、選中的老師等其餘特徵;老師(Teacher)還須要:學生限數、名下學生等其餘特徵,加上這些東西,才能完整的描述一個可供操做的對象!因此 Person類理應做爲抽象類,goToClass方法是子類必須重寫的方法,代表子類是去學習的,仍是上課的。

public class Student extends Person {
    private int selLesson;
    private int selTeacher;

    @Override
    public void goToClass() {
        System.out.println("偶是學生,偶來聽課的");
    }
}
public class Teacher extends Person {
    private int studentNumLimit;
    private List<String> students;

    @Override
    public void goToClass() {
        System.out.println("偶是老師,偶來說課");
    }
}

 

2、爲何要用抽象類 什麼狀況下用抽象類 

  一、根本緣由:沒法完整描述一個事物的類

  二、抽象類有一個特徵,其抽象方法,必須在子類重寫(子類非抽象類),因此,當咱們父類的方法,必需要子類重寫實現時,用抽象類。如上面的 goToClass() 方法,學生、老師去課堂的目的徹底不一樣,必須本身實現。

  三、跟接口相比,接口的方法必須由實現類所有實現,接口方法比較多時,就會麻煩,而抽象類沒有這樣的限制。好比jdk 裏面的 AbstractList,是ArrayList 的父類,裏面全是方法,你只須要重寫本身須要的

  四、易於理解,有時候,這樣的設計,讓人更容易理解它的層級等。我的認爲全部的設計原則都是死的,爲了提升代碼的實際可操性,犧牲部分設計原則是能夠的

相關文章
相關標籤/搜索