你知道的Java和你不知道的Java(轉載)
阿新 • • 發佈:2019-01-29
最近我們收到一封電子郵件,諮詢 “什麼是Java?”條目的資訊。在2006年,難道還有人不知道“什麼是Java”嗎?十年來,有大量介紹Java的書籍、網站和會議,難道不是所有人都知道“什麼是Java”嗎?顯然答案是否定的。
畢竟,情況已經改變。
每個涉及applet和實時(Just-in-time)編譯器的含糊定義都有許多已固定下來併為許多人所瞭解的新說明和新事實,但它們並非全部都寫入文件中了。過去,Java常常意味著:
•Applet
•位元組碼解釋
•緩慢的效能
•等待Sun恩賜的“拜物教”
而如今,它意味著:
•Web應用程式、Web服務、SOA等等
•熱點動態編譯
•高效能
•一個日益獨立於Sun的開源社群
過去有個口號叫做“一次編寫,隨處執行”,這仍然是事實,但編寫的內容及其執行環境和方式正在改變。
Java程式語言
Java是一種面向物件的高階程式語言,它在許多方面受到C、C++和Smalltalk的影響,還借用了其他語言的概念。其語法的設計方式使得那些熟悉 “大括號”語言(繼承自C)的人也會熟悉Java語法,但它具有比C++更強的面向物件性、物件的靜態型別轉換以及相當嚴格的異常系統,該系統要求呼叫堆 棧中的每個方法要麼處理異常,要麼宣告其丟擲異常的能力。當然還有垃圾自動收集功能,這使開發人員不必釋放由廢棄物件佔用的記憶體。
Java的一個比較受爭議的方面(這些方面在釋出Java時被廣為接受,但現在正日益受到批評)是它的不完全的面向物件性。具體來說, Java基本型別(如int、char、boolean等等)都不是物件,並且開發人員需要以完全不同的方式來處理它們:由於int不是類,因此不能為其 建立子類併為其宣告新方法,也不能將它傳遞給需要普通物件的方法,諸如此類。基本型別提高了Java的效能,但卻降低了程式碼的清晰度,這一點使用所謂的 “包裝器類”(Integer、Character和Boolean)的人應該深有體會。Java 5.0引入了autoboxing(自動裝箱)模式,以消除許多使用包裝器類的用例,但在某些方面這使程式碼的功能不那麼明顯了。
從理論上講,Java是種“早期出錯”語言。由於它的語法約束,許多程式設計錯誤在Java中不可能出現。由於不能直接訪問指標,所以指標 運算錯誤也就不存在了。使用物件時的型別如果與當初宣告它的型別不同,就會要求進行顯式的型別轉換,這使編譯器能夠拒絕不合邏輯的程式設計,如對一幅影象呼叫 一個字串方法。
許多Java企業框架都要求使用配置檔案或者部署描述符(通常用XML編寫)來指定操作:哪個類處理特定的HTTP請求、在規則引擎中 執行的步驟順序等等。實際上,要實現這些功能不能只用這種語言。評論人士指出,這會產生不當後果:不僅避開了Java編譯器的檢查,而且開發人員無法再 (只)根據程式的原始碼就可確定它如何執行。Java 5.0為該語言添加了註釋(annotation)特性,它允許使用值為方法、欄位和類新增標籤,在執行時,通常可通過反射對這些值進行內省和操作。許多 程式設計師喜歡註釋,因為它簡化了工作,否則就需要通過部署描述符或其他方法來解決問題。但是,註釋也有可能使Java程式碼難以理解,因為註釋的有無可能會影 響程式碼的執行方式,而這從註釋中不太容易看出來。
儘管存在這麼多的批評意見,但Java通常還是被認為是當今最流行的通用計算語言。在企業程式設計領域,它是一個廣泛使用的標準,而且 2005年它取代C++成為SourceForge專案使用最多的語言。使用Java有很多好處:免費的工具(適用於多種平臺:Linux、 Windows、Solaris和Mac均可編譯和執行Java應用程式)、內容豐富的知識庫以及大量樂意提供幫助的開發人員。
Java語言已經達到了開發人員生產率與程式碼效能之間的一個特定平衡點:CPU週期成本持續降低,但開發人員的開發週期卻並未明顯縮 短,因此在開發人員與CPU操作碼執行之間再出現一個抽象層也許是不可避免的了,它將使開發人員能夠更快地建立更好的軟體。實際上,Java生產率的批評 者(如《Beyond Java》的Bruce Tate)可能正是觀察到了這種不斷推進Java使其達到新的平衡點,從而進一步犧牲效能去換取更高的開發人員生產率的趨勢。
Java平臺
通常有三種Java平臺:Standard Edition(標準版,SE)、Enterprise Edition(企業版,EE)和Micro Edition(微型版)。每個平臺都是一個包含某個語言版本、一組標準庫和執行程式碼的虛擬機器(見下文)的組合。EE是SE的超集,任何EE應用程式都可 假定所有的SE庫都存在。EE平臺的語言使用與SE的一樣。
由於小型裝置(如:電話或機頂盒)的侷限性,Java Micro Edition與另兩個版本有很大區別。它並非SE的子集(像SE是EE的子集那樣),因為它的一些庫只存在於Micro Edition中。而且,ME取消了一些語言特性,如float型別和Float類,這反映了它的執行平臺的侷限性。ME需要與SE和EE不同的工具,而 且裝置之間的巨大差異使ME領域程式碼的可移植性更加不現實,因此許多Java開發人員將ME視為異類。