面向對象編程的一些思考

這段時間一直都在學習python,主要目的仍是打算學習一門互聯網的編程語言,爲後續的職業生涯作一些規劃,畢竟java在互聯網除了電商領域有叫普遍的使用場景以外,在互聯網其餘領域還不是很普及,而且java過重量級了。而python在相對來講輕量級而且易於使用,很適合互聯網產品快速迭代開發方式。javascript

我的以前接觸的惟一一個純面向對象編程語言就是java,以致於很長一段時間內,我都覺得面向對象編程的模型應該都是以java這樣爲基礎的,直到看了javasript和python等以函數式編程爲主,支持面向對象編程的語言,才更深的瞭解面向對象的編程本質。java

什麼是對象,對於對象的理解,我感受就是具備某些特性的物質,好比說狗。而面向對象編程最大的特色就是 把 對象的屬性和它相關的行爲進行封裝,好比狗的品種就是狗的屬性,可是狗叫就是狗的行爲。咱們把這兩個特性封裝到一個具體的對象裏面,就構成了面向對象的編程的基礎。若是把對象的屬性稱做數據,對象的行爲成爲函數,那麼數據就構成了對象的狀態,同一個對象中的數據能夠有不少不一樣的版本,數據是變化的,函數是不變的,只不過這個函數就是屬於這個對象的。python

可是對象的行爲必定非要和對象綁定嗎?是否是能夠脫離對象而獨立存在了。好比咱們說狗叫,那麼叫這個動做,必定非要和狗綁定嗎,是否是也能夠和人綁定的?還有就是比較兩個數的大小,這個行爲的對象是誰 ? 經過這些思考咱們發現,不少時候行爲和能夠獨立對象獨立存在的,這些獨立存在的行爲不屬於任何對象,或者咱們並不須要關心他屬於誰,只須要關注他的目的是什麼便可。編程

以上兩個問題在java裏面都反映的比較明顯,static關鍵字用來代表這個行爲不和任何對象綁定,好比public static void main ,這個main方法就不屬於定義它的class所對應的對象。還有java裏面的Math類,這個類裏面的方法都是public static的,說明這些方法都不屬於任何對象。而java是純面向對象的,只能把這些不屬於任何具體對象的定義爲static,而其對應的class類,感受給他定義了一個命名空間而已。app

python中的面向對象的設計感受比java要複雜,可是經過和java面向對象的設計相比,可以讓你更深刻的瞭解面向對象編程的核心。python中 class若是定義對對象的行爲,第一個參數好比爲self。當初本身對這個設計理解很不理解,爲何弄的這麼複雜,後來想一想面向對象思想是什麼,忽然就明白了,這個self就是數據,方法就是行爲,這個行爲要和某個對象綁定,只不過java裏面幫助咱們省去了這個過程,經過建立對象的語法new XXXClass 自動進行綁定。java是靜態的,一旦方法和數據進行綁定,這個綁定關係就不會發生改變,可是python綁定關係就能夠進行改變。若是方法參數中沒有self,那麼這個方法就和java裏面的static方法相似,表示這個方法屬於某一個類,不屬於某個對象。編程語言

而javascript面向對象設計就是更有意思了,構造函數自己就是一個function,經過function.apply方法和具體的對象進行綁定,在javascript中用this來表示function所綁定的對象。函數式編程

而在scala中,對象的方法和class 對應的static方法就徹底分開了。更確切的說,class對應的static方法,就不屬於這個class,因此scala定義了object 這個概念。全部class中定義的方法都屬於對象的行爲,而以前java中全部class static方法,都屬於object。二者在語法上都已經明確區分了。我的感受這個明顯比java,python,javascript  對static方法的支持簡潔明瞭的多。函數

對於面向對象的設計,不一樣的語言雖然不一樣,可是其核心思想仍是類似的。可是因爲編程語言所支持的編程範式不同,實現方式差異仍是比較大的。經過學習多範式編程語言,可以加深對這種編程範式的理解。學習

相關文章
相關標籤/搜索