前幾天被電話面試,問Java的參數傳遞方式,我說只有一種方式,就是by value啊,對方糾正我說,基本類型傳值,物件類型傳引用;嗚呼,當時被噎了一下,幾秒鐘後回過神來,我明白他的意思,也明白我碰上新世紀的新新人類了,但我怕他不明白啊,就說我們還是先把“引用”這個概念定義清楚吧,不要同一個詞兩人有兩個意思,或者舉個例子吧,在函數裡對String類型的參數賦值是不影響實際參數的啊,於是他也明白我其實也明白,電話面試就算過了 然而還不算完,正式面試的四輪:筆試題,筆試完後與leader談,談完後與manager談,談完後與VP談,居然每一輪都有這道題!只不過換成了swap函數的形式,讓你說出執行結果;我就納了悶了,這道題在人們心目中的形象就那麼高大?並且甲方答案也似是而非? Bjarne一直認為是C++的教育害了C++,那麼是什麼害了Java語言呢?過度的商業宣傳! 當然,商業宣傳成功的協助了Java平台,吸引了大量開發人員,但對Java語言來說,先聽到宣傳詞後再來學習的初學者,耳中充斥的是“Java取消了指標”,“Java沒有記憶體泄露”,“Java純物件導向”等宣傳用語,先入為主的就接受了表面現象,而沒有理解問題的實質 Java取消了指標?看看那個所謂的“引用”為空白時拋出的異常吧,看看在Java實現者的眼中這個東西到底是啥吧:NullPointerException!不是我鄙視Sun,它的細節偽裝的確實不如MS:.net裡對應的異常叫NullReferenceException,雖然也是換湯不換藥;作為一種類C語言,我認為對應概念的命名還是一致較好,Java裡其實全是指標,你基本無法得到對象本身,只不過這種指標功能受限,不需刪除而已 指標的概念被偽裝起來,不需要delete了,那麼除記憶體之外的其它資源呢?數數你的程式裡有多少個finally就可以了 Java純物件導向?其實就這句話本身來說也無可厚非,只是它使用了<<箭魚行動>>裡定義的“錯誤引導”,這句話會使初學者傾向於認為用Java寫出來的程式都是物件導向的,從而阻礙了理解真正的物件導向;數數你程式裡有多少根據物件類型的switch/if/else就可以了 題外話: 面試時被問道物件導向的三個基本特徵,我知道他想聽到什麼封裝繼承多態,但實際上傳統物件導向的核心特徵就是多態,繼承只是用來實現多態的一種手段,並非本質特徵;C語言沒有繼承,但照樣可以進行OO風格的編程。 |