Java基礎(chǔ)知識總結(jié)-面向?qū)ο蠛兔嫦蜻^程的區(qū)別

面向過程是指,允許在程序中定義函數(shù)或者方法。也許你覺得奇怪,難道還有語言不能定義函數(shù)方法么?早期的basic就不可以,只能用跳轉(zhuǎn)來實現(xiàn)函數(shù)調(diào)用。
面向?qū)ο蟾徊?,允許你將“過程”(函數(shù)、方法)以及它們的上下文相關(guān)的數(shù)據(jù)封裝成對象,同時對象允許通過繼承和派生以及類型限定符限制開發(fā)者對它的一部分的進行訪問和修改。
我不想把面向?qū)ο蠛蜕钪械氖挛锶ヂ?lián)系,固然它們有些似是而非的聯(lián)系,但是這對于你理解編程的本質(zhì)毫無意義,甚至?xí)`導(dǎo)你。面向?qū)ο蟮谋举|(zhì)不是模擬現(xiàn)實世界的對象,而是為了開發(fā)強壯、簡單和可維護的代碼。
將面向?qū)ο笳f的通俗易懂的壞處就是看上去是通俗易懂了,其實你懂的根本就是錯的東西,而且這使得新手完全誤入歧途。
面向?qū)ο蟮娜筇匦裕ǚ庋b、繼承、多態(tài)),核心一條是封裝,不允許你訪問私有的函數(shù)和成員這個相信很多人都理解,其實還有一層,就是不允許開發(fā)者隨便修改代碼,因為隨意修改代碼和隨意修改變量的值一樣是災(zāi)禍之源。
在面向過程中,如果你發(fā)現(xiàn)程序不合適了,需要增加功能,你會怎么做?你會直接去修改某個函數(shù)的代碼,但是如果這個函數(shù)不是你寫的,你不完全理解,這么做會可能出問題。另一個問題是,你不知道現(xiàn)有的代碼是怎么調(diào)用這個函數(shù)的。換一句話說,你修改了它,你這里是滿意了,別的地方的調(diào)用呢?會不會有問題?
那么怎么辦?你想,這不簡單,我把這個函數(shù)拷貝一份,在拷貝上修改,不動原來的函數(shù)。這樣問題又來了。如果原來函數(shù)的編寫者發(fā)現(xiàn)了一個bug,他修復(fù)了,可是你拷貝的那份的bug不會自己修復(fù),除非修改的時候要知道這代碼都被拷貝了幾份,一一修改。
面向?qū)ο笫窃趺唇鉀Q這個問題的呢?開發(fā)者通過編寫一個類,實現(xiàn)一個功能,這個類中一些方法被定義為虛擬方法。當(dāng)你需要修改這個方法適應(yīng)新的需求的時候,你不是直接去修改這個類的源代碼,而是派生一個類,去重寫這些允許你自定義的虛擬方法,這樣你就在可控的范圍內(nèi)自定義了原來的程序。但是因為別的地方調(diào)用的是基類的類型,而你并沒有修改基類的代碼,所以不會造成原先的代碼出問題。而且,基類的原作者如果發(fā)現(xiàn)一個非虛擬的方法有bug,他直接修改就好了。因為你的類是繼承的這些代碼,而不是拷貝粘貼的,所以修改一處,就全部變過來了。
關(guān)注“動力節(jié)點Java學(xué)院”微信公眾號,更多Java基礎(chǔ)知識等你來獲取。