面向?qū)ο蟮娜筇匦裕豪^承、封裝、多態(tài)但其實這個說法有問題。面向?qū)ο蟮乃枷肜餂]有任何繼承和多態(tài)的概念,正確的說法是:這三大特性是面向?qū)ο笳Z言的特性,而不是面向?qū)ο罄砟畋旧淼摹?/p>面向?qū)ο笳Z言是面向?qū)ο笤O計思想的一種實現(xiàn),面向?qū)ο笳Z言為了能在真實世界使用,其必須經(jīng)過一些拓展和妥協(xié),而問題也就隨著這些拓展和妥協(xié)而來。


class?Super?{
??private?int?counter?=?0;
??void?inc1()?{
????counter ;
??}
??void?inc2()?{
????counter ;
??}
}
class?Sub?extends?Super?{
??@Override
??void?inc2()?{
????inc1();
??}
}
你看,子類覆蓋了父類的 inc2 方法,但是這個 inc2 方法依賴于父類 inc1 的實現(xiàn)。如果父類的 inc1 邏輯發(fā)生變化了,變成下面這樣class?Super?{
??private?int?counter?=?0;
??void?inc1()?{
????inc2();
??}
??void?inc2()?{
????counter ;
??}
}
這就會出現(xiàn) stack overflow 的異常,因為出現(xiàn)了無限遞歸。所以,當我們在子類里,依賴了父類方法作為子類業(yè)務邏輯的一個關鍵步驟的時候,當父類的邏輯修改的時候,必須聯(lián)動修改所有依賴父類相關邏輯的子類,否則就可能引發(fā)嚴重的問題。用繼承,本來是想少寫點代碼少加點班,結(jié)果……用網(wǎng)上看到的一句話說就是:一日為父,終生是祖宗。像這種情況該怎么辦?現(xiàn)在只要是個正經(jīng)的介紹面向?qū)ο蟮募夹g文章或者書籍里,只要是涉及到繼承的,都會加這么句話:盡量選擇對象組合的設計方式。在《阿里巴巴Java開發(fā)手冊》中就有一條:



A?a?=?new?A();
B?b?=?a.getB();
好,我們要問了,這個從 A 中獲取的 B,是 B 對象的實例還是實例的一個引用指針呢?必然是引用指針吧,這是最基礎的知識。諾,問題來了,引用指針是可以修改的。b.getS();?//原來是Hello?World
b.setS("World");//直接改成World
原來 B 中有個字段 s,值是個 “Hello World”,我直接可以用代碼改成“World”。如果這次修改隨意在個犄角旮旯里,A 能知道嗎?A 蒙在鼓里,還以為一切盡在把控當中呢。你看,封裝的縫兒出來了吧。說句實話,就這種鬼操作,是非常難以排查的。像這種封裝了,但是又沒封裝的問題,我只想說“封裝的挺好的,下次別封裝了”。按企業(yè)主營業(yè)務類型分,我國智能家居行業(yè)競爭派系可分為傳統(tǒng)家電企業(yè)、互聯(lián)網(wǎng)企業(yè)以及其他企業(yè)三派。傳統(tǒng)家電企業(yè)代表有海爾智家、美的集團、格力電器等,具有供應鏈和銷售渠道,制造能力和品牌優(yōu)勢突出;互聯(lián)網(wǎng)企業(yè)代表有小米集團、百度...
關鍵字: 智能家居 互聯(lián)網(wǎng)企業(yè) 供應鏈我國汽車零配件行業(yè)細分種類眾多,從汽車零配件主要產(chǎn)品來看,發(fā)動機系統(tǒng)行業(yè)內(nèi)有濰柴動力、華域汽車等主要從業(yè)企業(yè);在車身零部件領域內(nèi),福耀玻璃、中策橡膠具有一定的規(guī)模優(yōu)勢;行駛系統(tǒng)領域內(nèi)有中策橡膠提供的輪胎以及華為等企業(yè)提供...
關鍵字: 汽車零配件 發(fā)動機 行駛系統(tǒng)