java零基礎(chǔ)入門-面向?qū)ο笃?/b>(十二)? 抽象類
抽象類這個(gè)玩意剪芍,理解起來費(fèi)點(diǎn)勁孤钦。我們從字面意思開始吧。
抽象一詞的本義是指人在認(rèn)識(shí)思維活動(dòng)中對(duì)事物表象因素的舍棄和對(duì)本質(zhì)因素的抽取。說人話就是刪除看的懂得吠裆,留下看不懂的渐逃。
應(yīng)用于美術(shù)領(lǐng)域够掠,便有了抽象性藝術(shù)、抽象主義茄菊、抽象派等概念疯潭。
來看一個(gè)著名的抽象派作品。
84歲的美國藝術(shù)家羅伯特·雷曼1961年創(chuàng)作的油畫《無題》面殖,以折合人民幣8000萬至1.2億元的價(jià)格拍賣竖哩。
我感覺這畫跟我家衛(wèi)生間的瓷磚有點(diǎn)像,莫非我家的還是個(gè)抽象派衛(wèi)生間不成...
至于抽象類脊僚,它和抽象畫還真的有點(diǎn)相似之處
抽象畫:我告訴你我畫了一幅畫相叁,具體畫的啥,我也不知道辽幌!
抽象類:我告訴你我定義了一些方法增淹,方法具體做什么,我也不知道乌企!
為什么要抽象類
畫家分為很多流派虑润,以我淺顯的藝術(shù)知識(shí),大概分得清楚三個(gè)流派的畫家加酵,抽象派拳喻,印象派,立體派猪腕。
現(xiàn)在確定了父類 - 畫家冗澈,然后三個(gè)子類 抽象派畫家 , 印象派畫家码撰,立體派畫家去繼承畫家這個(gè)類渗柿。畫家類里面有一個(gè)方法,畫畫,這個(gè)方法是必須有的朵栖。
好了颊亮,問題出現(xiàn)了,當(dāng)我們使用父類 - 畫家創(chuàng)建對(duì)象陨溅,然后調(diào)用 畫畫這個(gè)方法的時(shí)候终惑,它應(yīng)該畫出來的是哪個(gè)流派的畫?
是不是懵圈了门扇?你就給我個(gè)畫家雹有,也沒問人家是哪一派的,就拉著人家畫畫臼寄,鬼知道他畫的啥霸奕。
這說明一個(gè)什么問題?如果我們將某一部分事物的特征抽取出來吉拳,定義成了父類质帅,其實(shí)這個(gè)父類是具有指導(dǎo)性的,而不是可實(shí)現(xiàn)性留攒。
說人話煤惩,你非要將畫家提出一個(gè)父類,那么就不要在父類里面實(shí)現(xiàn)方法炼邀,也就是不要在父類里面寫代碼邏輯魄揉。因?yàn)楦割惒⒉恢浪约罕粚?shí)例化以后,該如何實(shí)現(xiàn)方法拭宁。
比如這個(gè)畫家洛退,如果不是畫家的子類,具體到某個(gè)流派的畫家杰标,在畫家這個(gè)類里面實(shí)現(xiàn)畫畫這個(gè)方法是毫無意義的不狮。他不知道該畫個(gè)什么流派的畫出來。我們只會(huì)使用子類重寫的畫畫方法在旱,而不會(huì)使用父類的畫畫方法。
有同學(xué)肯定有疑問推掸,既然我們不使用父類里面的畫畫方法桶蝎,刪掉不就行了?只在子類里面寫畫畫的方法不就行了谅畅?
那么我請(qǐng)問你登渣,你見過連畫畫都不會(huì)的畫家嗎?畫家這個(gè)類沒有畫畫這個(gè)方法毡泻,就算代碼不錯(cuò)胜茧,你的類的設(shè)計(jì)就是錯(cuò)的。類是對(duì)實(shí)際事物的抽象,這個(gè)是原則呻顽。
那該怎么做雹顺?
這時(shí)候就該抽象方法登場(chǎng)了。把畫畫這個(gè)方法定義成抽象方法廊遍,畫家父類并不實(shí)現(xiàn)任何代碼嬉愧,而是留給子類去實(shí)現(xiàn)他。你是什么派的畫家喉前,畫畫的方法就畫什么派的畫就行了没酣。
看到了沒有,抽象方法的核心思想就是 啥也不做~ 具體要做的卵迂,用子類去實(shí)現(xiàn)抽象方法即可裕便。
抽象類的清規(guī)戒律
1.抽象方法不能被調(diào)用。
2.一個(gè)類被定義為抽象類以后见咒,就不能使用new關(guān)鍵字新建對(duì)象了偿衰。
3.抽象類的子類必須重寫抽象方法。
這三個(gè)規(guī)則放在一起论颅,因?yàn)樗麄?b>環(huán)環(huán)相扣哎垦。為了方便記憶,我們用代碼來講解恃疯。
首先看報(bào)錯(cuò)情況漏设。
1.因?yàn)槌橄蠓椒]有方法體,啥也不干今妄,所以不能調(diào)用抽象方法郑口,因?yàn)檫@樣做毫無意義。
2.假設(shè)可以實(shí)例化抽象類盾鳞,那么就可以用抽象類的對(duì)象去調(diào)用什么也干不了的抽象方法犬性,這樣違背了第一條原則。
3.如果繼承了抽象類腾仅,而又不去重寫(實(shí)現(xiàn))抽象類的抽象方法乒裆,會(huì)發(fā)生什么?因?yàn)樽宇悰]有實(shí)現(xiàn)父類的抽象方法推励,那么用子類對(duì)象就可以調(diào)用到父類的抽象方法鹤耍,這樣也違背了第一條原則。
4.抽象類可以包含普通方法和構(gòu)造器验辞。抽象類就是專門用來被子類繼承的稿黄,如果子類都有一個(gè)不必被重寫的方法,那么可以將它定義在父類里面跌造,每個(gè)子類都可以調(diào)用他杆怕。構(gòu)造器也一樣,可以被子類復(fù)用。
比如畫家除了畫畫這個(gè)抽象方法以外陵珍,還可以有賣畫這個(gè)方法寝杖,上面那位大師的一幅畫可是賣了幾千萬。每個(gè)畫家都可以賣畫撑教,自己不去實(shí)現(xiàn)朝墩,就調(diào)用父類的方法。構(gòu)造器也是一樣伟姐,可以用super調(diào)用抽象類的構(gòu)造器收苏,大家可以自己實(shí)現(xiàn)一下。
舉個(gè)栗子
說了半天抽象類愤兵,下面再舉個(gè)例子幫助大家更好的理解一下鹿霸。
來來來,需求講解一下秆乳,現(xiàn)在要做三個(gè)功能懦鼠,請(qǐng)假,加班屹堰,外出肛冶,原型圖如下。如果是你你會(huì)怎么做扯键?
如果我們沒有一點(diǎn)點(diǎn)的抽象能力睦袖,肯定會(huì)說,這還不簡(jiǎn)單荣刑,做三個(gè)功能唄馅笙。
但是我們現(xiàn)在可是學(xué)過抽象類的人了,怎么能做這么不優(yōu)雅的事厉亏,我們必須要有設(shè)計(jì)的概念董习。
我們觀察了原型圖以后,可以看到爱只,紅色框中的內(nèi)容皿淋,是三個(gè)功能都有的。不管你是請(qǐng)假恬试,外出沥匈,還是加班,都需要一個(gè)人來對(duì)你的請(qǐng)求進(jìn)行審批忘渔。這個(gè)是必須的(前面有個(gè)紅色星星)。
而審批轉(zhuǎn)聊天功能和抄送功能都是非必須的缰儿,可以不填畦粮。
再看藍(lán)色框框,請(qǐng)假事由必須填,照片可以不填宣赔。
外出事由是必須填的预麸,沒事別亂跑,好好上班儒将。
加班事由可以不填吏祸,叫你加班還需要理由么?
分析過后钩蚊,我們總結(jié)一下贡翘,紅色框里的是相同的功能可以提出來復(fù)用,而藍(lán)色框是每個(gè)功能獨(dú)有的砰逻。
我們看看用抽象類的高端玩家和不用抽象類的普通玩家是如何設(shè)計(jì)以上功能鸣驱。
普通玩家設(shè)計(jì)了三個(gè)功能,自己體會(huì)蝠咆。
高端玩家抽象了一個(gè)抽象父類踊东,這樣設(shè)計(jì)還有一個(gè)優(yōu)點(diǎn)。如果像普通玩家一樣設(shè)計(jì)三個(gè)獨(dú)立的類刚操,那么可能會(huì)漏掉功能闸翅,比如說在請(qǐng)假單里面,忘記寫add_reason這個(gè)方法菊霜,這是有可能發(fā)生的坚冀。
而如果設(shè)計(jì)成子類繼承抽象父類,則不會(huì)發(fā)生這種情況占卧,因?yàn)槌橄蠓椒ū仨殞?shí)現(xiàn)遗菠,不然就報(bào)錯(cuò)。這也是用抽象類來規(guī)范子類的一個(gè)好方法华蜒。
請(qǐng)好好理解本章內(nèi)容辙纬,因?yàn)橄乱徽拢瑫?huì)介紹一個(gè)比抽象類更抽象的一個(gè)知識(shí)點(diǎn)叭喜,請(qǐng)做好準(zhǔn)備贺拣。