如何徹底理解Java抽象類為什么要用抽象類什么情況下用抽象類
吶,到底什么是抽象類,有時明明一個普通類就可以解決了,為啥非得整個抽象類,裝逼嗎
我曾帶著這樣的疑惑,查了很多資料,看了很多源碼,寫了很多代碼,以下是我的理解
一、徹底理解Java抽象類
當(dāng)我們無法理解一個事物的時候,我們得追尋他的根源:萬物皆對象
在面向?qū)ο笾?,世間萬物皆通過類來描繪。但如果一個類描繪一個具體的事物時,卻沒有包含足夠完整的信息,這樣的類就是抽象類。
舉個栗子
(豬狗牛羊鳥器車的例子就不要看了,都是一些教科書上沒有任何實操意義的例子)
讓你設(shè)計一個簡單的學(xué)生選課系統(tǒng)
基本需求:學(xué)生選課,老師授課。
最終會抽象出其中2個領(lǐng)域?qū)ο螅簩W(xué)生、老師。當(dāng)我們用類去描述學(xué)生、老師時,他們的共性是人(Person):有名字、年齡、職業(yè)等特征,有上課(學(xué)習(xí)、授課都屬于上課)等行為;
public?abstract?class?Person?{????protected?String?name;????protected?int?age;????protected?int?profession;????public?abstract?void?goToClass();}
我們想想,光有這些特性、行為,就能完整的描述出一個可在選課系統(tǒng),操作的對象(學(xué)生或老師)嗎?顯然不行!學(xué)生(Student)還需要:所選課程、選中的老師等其他特征;老師(Teacher)還需要:學(xué)生限數(shù)、名下學(xué)生等其他特征,加上這些東西,才能完整的描述一個可供操作的對象!所以Person類理應(yīng)作為抽象類,goToClass方法是子類必須重寫的方法,表明子類是去學(xué)習(xí)的,還是上課的。
public?class?Student?extends?Person?{????private?int?selLesson;????private?int?selTeacher;????@Override????public?void?goToClass()?{????????System.out.println("偶是學(xué)生,偶來聽課的");????}}
public?class?Teacher?extends?Person?{????private?int?studentNumLimit;????private?List?students;????@Override????public?void?goToClass()?{????????System.out.println("偶是老師,偶來講課");????}}
二、為什么要用抽象類什么情況下用抽象類
1、根本原因:無法完整描述一個事物的類
2、抽象類有一個特征,其抽象方法,必須在子類重寫(子類非抽象類),所以,當(dāng)我們父類的方法,必須要子類重寫實現(xiàn)時,用抽象類。如上面的goToClass()方法,學(xué)生、老師去課堂的目的完全不同,必須自己實現(xiàn)。
3、跟接口相比,接口的方法必須由實現(xiàn)類全部實現(xiàn),接口方法比較多時,就會麻煩,而抽象類沒有這樣的限制。比如jdk里面的AbstractList,是ArrayList的父類,里面全是方法,你只需要重寫自己需要的
4、易于理解,有時候,這樣的設(shè)計,讓人更容易理解它的層級等。個人認(rèn)為所有的設(shè)計原則都是死的,為了提高代碼的實操性,犧牲部分設(shè)計原則是可以的
以上就是長沙中公優(yōu)就業(yè)java培訓(xùn)機(jī)構(gòu)的小編針對“Java什么是抽象類?什么情況下用到”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。