剛開始接觸java時,首先了解到的就是面向對象語言的四個基本特征 抽象 繼承 封裝 多態 以及一大堆面向對象語言的優點包括代碼重用,權限控制,易擴展,開發效率高之類的,其實面向對象語言從誕生之日起就一直伴隨着許多的缺陷,包括並不限於以下幾點:
一、大大增加了代碼量,包括非常多的冗余代碼
對於面向過程語言來說,編程時需要哪些變量和方法就只編寫這些變量和方法,而對於面向對象語言來說,每次無論你要使用什么都要先寫一個類,並且每一個類都要有獨立的變量和方法,這樣就會造成可能很簡單的問題也要很多的類代碼,為了解決這個缺點,繼承便出現了,繼承可以讓類與類可以共享代碼,一定程度上降低了代碼量。
二、對象與對象之間相互依賴,耦合性太高
由於面向對象語言中一切都是對象,我們必須使用一個對象去創建另外一個對象,才能使用其內部方法,這樣就造成了這些對象之間相互依賴,為了消除這些依賴,我們可以把創建對象的代碼全部集中到一個對象之中,其他的對象都通過調用該對象的方法來動態的獲取所需要的對象,這也就是我們所說的工廠模式。進一步地,我們可以不使用工廠,而是編寫一個插件,該插件可以把我們所需要的對象在運行時動態地“塞”給我們,這就是依賴注入,也就是控制反轉。這個插件就相當於Spring IOC。
三、運行速度慢
java中所有的對象都是存在於堆中,生成對象訪問對象時速度都很慢,java把對象放在堆里,把對象的引用放在棧中,通過引用調用對象這樣訪問速度會稍快一些,jvm中的GC垃圾回收機制,會自動清理垃圾對象,並把有效的對象在堆中全部集中在一起,這樣創建對象時,尋找空白的堆內存也會快一點。相當於windows的磁盤碎片整理。
四、失去了靈活性
面向對象語言代碼都很死板,繼承也沒有運行時動態,但是java的多態機制,其不同於面向過程語言的方法后期綁定,在運行時才能確定具體調用的是哪個方法一定程度上增加了其靈活性。面向對象語言一直提倡的組合大於繼承的思想誕生了許許多多的設計模式,這些設計模式通過對組合和多態的奇妙運用大大的增加了面向對象語言的靈活性。
綜上所述,其實在我們的學習過程中可以看到面向對象語言有許多優秀的地方,但也有一些缺陷,而我們一直都在努力地想盡各種辦法去彌補這些缺陷,通過一些機制讓面向對象語言越來越來趨於完善。
