如何徹底理解Java抽象類 為什麼要用抽象類 什麼情況下用抽象類 吶,到底什麼是抽象類,有時明明一個普通類就可以解決了,為啥非得整個抽象類,裝逼嗎 我曾帶著這樣的疑惑,查了很多資料,看了很多源碼,寫了很多代碼,以下是自家的理解 一、徹底理解Java抽象類 當我們無法理解一個事物的時候,我得追尋他的本 ...
如何徹底理解Java抽象類 為什麼要用抽象類 什麼情況下用抽象類
吶,到底什麼是抽象類,有時明明一個普通類就可以解決了,為啥非得整個抽象類,裝逼嗎
我曾帶著這樣的疑惑,查了很多資料,看了很多源碼,寫了很多代碼,以下是我的理解
一、徹底理解Java抽象類
當我們無法理解一個事物的時候,我們得追尋他的根源:萬物皆對象
在面向對象的概念中,世間萬物通過類來描繪的,但如果一個類中沒有包含足夠的信息來描繪一個具體的事物對象,這樣的類就是抽象類。(參考 https://www.runoob.com/java/java-abstraction.html)
無論你在其他渠道看到過多少關於抽象類的解釋,都沒有這樣解釋合乎根本!
舉個慄子
(豬狗牛羊鳥器車 的例子就不要看了,都是一些教科書上沒有任何實操意義的例子,看了你最終也不明白是啥玩意兒)
讓你設計一個簡單的學生選課系統
基本需求:學生選課,老師授課,每個老師只能接受有限個個學生,每個學生只能選一個老師。
最終會抽象出其中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("偶是老師,偶來講課"); } }
二、為什麼要用抽象類 什麼情況下用抽象類
1、根本原因:無法完整描述一個事物的類
2、抽象類有一個特征,其抽象方法,必須在子類重寫(子類非抽象類),所以,當我們父類的方法,必須要子類重寫實現時,用抽象類。如上面的 goToClass() 方法,學生、老師去課堂的目的完全不同,必須自己實現。
3、跟介面相比,介面的方法必須由實現類全部實現,介面方法比較多時,就會麻煩,而抽象類沒有這樣的限制。比如jdk 裡面的 AbstractList,是ArrayList 的父類,裡面全是方法,你只需要重寫自己需要的
4、易於理解,有時候,這樣的設計,讓人更容易理解它的層級等。個人認為所有的設計原則都是死的,為了提高代碼的實操性,犧牲部分設計原則是可以的