標籤:不同的 ... 調度 特點 off 多態 str 反編譯 沒有
優點:
1.安全(廢棄指標)
任何一個學過C或者C++的人都知道指標的操作對於他們是很重要的,指標能夠支援記憶體的直接操作,這樣的直接操作能夠帶來的是效率上的提高.但是任何一個東西都是有副作用的,指標給程式員帶了的混亂也是無可比擬的.對於一個不是很強勁的C程式員而言,指標是要命的(對我而言也是,我幾乎不會寫C代碼).而JAVA就為我們省去了這樣的麻煩,或者說JAVA完整的限制了對記憶體的直接操作,讓程式員能夠安心去搞商務邏輯,而不用管自己後院的那堆記憶體有沒有人來收拾
2.記憶體回收機制
其實記憶體回收也是JAVA對於記憶體操作的限制之一,也大大解放了程式員的手腳.但是也正是這樣的一個記憶體保姆的存在導致JAVA程式員在記憶體上幾乎沒有概念...一個純粹的JAVA程式員對於記憶體泄露這樣的問題是從來沒有概念的,因為他從來不用擔心,因為大多數情況下即便他大手大腳也不會有什麼問題,這樣也就導致了JAVA一個很顯見的缺點,我們後面會講到.
這裡我說點我想到的東西吧..其實JAVA並沒有讓程式員完全省心,他代辦的事情也僅僅是記憶體罷了,其他資源的調用和釋放都還是需要程式員自己來關心的,比如資料庫,比如檔案.當然了,我們不能指望什麼都吃現成的,總有東西是要自己做的吧.
3.平台無關性
平台無關性的真正意義在於程式的可移植性高,能夠在多個平台平滑遷移。這點就特別適合網路應用
缺點:
1.效率
1.1當然首先就是記憶體操作限制帶來安全的同時帶來的副面效果,就是效率比較低
1.2 面對對象的一個很重要的特點所帶來的——多態,這個東西是娘胎裡帶出來的,誰也沒辦法,而且這個因素的“後果很嚴重”,C++的多態是編譯器編譯和串連時實現的,java是運行時實現的,效率問題可見一斑了吧
1.3平台無關性帶來的。由於需要平台無關,所以JAVA是不能直接調用OS的API的,JAVA需要調用自己的API來隱式地調用OS的API,大家可想而知這樣的效果。多一層調用,必然多一層代碼需要載入到棧內了
2.逆向編譯問題
由於JAVA程式是動態串連的,從一個類到另外一個類的引用是符號化的。在靜態串連的可執行程式中,類之間的只是直接的指標或者位移量。相反地,在JAVA class檔案中,指向另一個類的引用通過字串清楚地標明了所指向的類的名字。如果引用指向一個欄位的話,這個欄位的名字和描述符會被詳細說明。如果引用指向一個成員變數,這個成員變數的名字和描述符(方法的傳回型別,方法參數的數量和類型)也會被詳細說明。這樣就可以反編譯得到源碼
3.線程調度問題
關於線程調度,說老實話,我在學作業系統的時候,所有的線程問題都是在linux下用C去做的,原因第一是linux的線程API比較清晰,而且我受不了Windows的那些API的名構造。第2就是因為我覺得Java雖然是一個總進程下的多線程,但是線程間的調度沒有非常的清晰,相比較而言,還不如直接叫用作業系統的線程支援呢(雖然linux對線程層級支援也不是特別好,但是畢竟不是有包支援的嘛),記得當初的哲學家饑餓問題我最後算是用JAVA調配出結果了,可是到最後我自己都暈了。這些都是我個人的看法,也很可能是一些偏見,至於別人書上專業的解釋是:由於為了能夠支援多種系統的不同的線程支援策略,JAVA只能採取這樣籠統而又鬆散的線程規範。
其實優點和缺點是相對的,做過比較就知道,其實優點和缺點有時候正是同一個因素帶來的.這也需要我們用唯物主義辨證原理來看待(我只是說唯物主義,沒有國籍的那種).更多的時候我們需要在我們所需要的東西和我們為此需要付出的代價間作出正確的trade off.(作業系統老師最喜歡說的詞).
java語言總結