宣傳語
深入挖掘JAVA之精華
內 容 簡 介
這是一本幾乎只講Java優點的書。
Jim Waldo先生是原Sun微系統公司實驗室的傑出工程師,他親歷並參與了Java從技術萌生、發展到崛起的整個過程。在這本書里,Jim總結了他所認為的Java語言及其環境的諸多精良部分,包括:類型系統、異常處理、包機制、垃圾回收、Java虛擬機、Javadoc、集合、遠程方法調用和並發機制。另外,他還從開發者的角度分析了在Java技術周圍發展起來的“開發者生態環境”。如果要把Java技術精煉到只含有它的最佳部分,在Jim看來,以上這些就是必須保留的部分。
作者還從歷史的視角闡述了Java中某些技術的發展歷程,解釋了某些問題之所以存在的原因,使人讀後有一種“知其所以然”的通透感。閱讀本書不但能使你重溫Java的核心機制,還可以使你了解語言的設計者和實現者們是如何權衡、折中並維護各種不同的語言特性,從而成就了這門流行的系統級通用程式語言的。
相信不管是Java語言的學習者,還是使用Java語言構建軟體系統的開發者,以及對程式設計語言感興趣的技術愛好者,都可以從本書中汲取營養。
譯 者 序
關於本書
這是一本幾乎只講Java 優點的書。作者總結了他所認為的Java 語言及其環境的諸多精良部分,包括:類型系統、異常處理、包機制、垃圾回收、Java 虛擬機、Javadoc、集合、遠程方法調用和並發機制。此外,作者還從開發者的角度分析了在Java 技術周圍發展起來的“開發者生態環境”。如果要把Java 技術精煉到只含有它的最佳部分,在作者看來,以上就是必須保留的部分。
作者還從歷史的視角闡述了Java 中某些技術的發展歷程,解釋了某些問題之所以存在的原因,使人讀後頓有一種“知其所以然”的通透感。通過翻譯本書,在重溫Java 核心機制的同時,譯者還了解了語言的設計者和實現者們是如何權衡、折中並維護各種不同語言的特性,從而成就這門廣受歡迎的系統級通用程式語言的。相信讀者也會有同樣的收穫。譯者認為,不管是Java 語言的學習者,還是使用Java 語言構建軟體系統的開發者,以及對程式設計語言感興趣的技術愛好者,都能從本書中汲取營養。
我為什麼選擇翻譯這本書
說起本書的翻譯,自然要提到當時在電子工業出版社博文視點工作的周筠老師。認識周老師是好多年前的事了,但真正面對面坐下來聊天不過是去年的事情。在那之後,周老師更成了我的良師,我常去翻翻她的新浪微博(@ 出版人周筠),而且常常能從中領悟不少有益的東西。有一天,看到周老師在徵集新書譯者,經過考慮,我很快向她表達了自己的意向,再加上周老師對我的信任,此事便得以促成。在這一過程中,還要好好謝謝當時同在博文視點的鸕東翔編輯,不是因為他讓我多認識了一個漢字,而是因為他對我太多的信任和幫助。當然,翻譯本書的另一個重要原因是翻看原書後對精彩內容的喜愛,這些前面已經提到了。還有一個原因:在我個人的技術知識結構中,程式語言的知識占了很大一部分,而之前翻譯過的幾本書大都與模式有關,更偏於“坐而論道”。其實我個人一直希望有機會翻譯一本語言方面的書注1。
注1 : 為了節省成本和便於讀者閱讀,我們將原書版式進行了壓縮,原書頁碼用“ ”表示,供讀者對照閱讀。本書的索引(包括正文中的交叉索引)所列頁碼為原英文版頁碼。
關於勘誤
翻譯與閱讀不同,翻譯過程會注重更多的細節。譯者在翻譯中就發現了原文的一些小問題,對於這些小問題,譯者都通過郵件得到了作者的確認,然後直接按確認後的內容翻譯的,且沒有提供譯註。同時,譯者也在O’Reilly 網站上提交了這些勘誤,說到這個,也要感謝作者Jim Waldo 先生及時的回覆。
致謝
除了上面提到的幾位,本書在翻譯和出版過程中還應感謝以下一些人。首先是本書的審校人張伸(新浪微博@loveisbug),之前我翻譯《敏捷開發的藝術》和《軟體開發者路線圖》時,他就熱心細緻地幫我審校過書稿,這次作為正式的審校人,他更是細緻地通讀了全稿,從中發現了不少小錯誤,還提出了大量的改進意見。其次要感謝群碩軟體開發(上海)有限公司前高級軟體工程師高遠(新浪微博@ 狼大人),我翻譯過的所有作品都有他的幫助,這本書也不例外,他協助初譯了本書第11 章的內容。祝願如今遠赴異域的他一切都好。感謝博文視點的李利健編輯,她從整體結構和行文風格方面對譯稿提出了許多意見和建議。此外,還有博文視點的丁曼、張春雨、劉皎,以及許多不知道名字的為本書的出版辛勤工作的人,這本書能與讀者見面,源於他們共同的努力。還有“譯言網”和“譯網情深”翻譯論壇上的一些並不熟悉的朋友,感謝他們幫我拆解了不少疑難雜句。最後,感謝我的家人,從爺爺、奶奶、爸爸、媽媽到我的妹妹,還有許多師長親朋,從小到大,走過的每一步都飽含著他們的鼓勵、支持與期盼。
王江平
2011 年3 月 於上海浦東
前 言
這是一本關於Java 程式語言和Java 編程環境的書。作為如今最廣泛使用的程式語言之一,Java 已經是許多書的主題了。當我寫下這句話的時候,在Amazon 網站上搜尋關於“Java編程”(Java programming)的書會得到11978 條結果。那么,為什麼還要寫一本呢?
寫這本書出於如下考慮:Java 在經歷了15 年左右的發展之後,已經變成了巨大的且相當複雜的語言和環境。自從Java 出現以來,僅語言本身就增加了大量的新東西。與語言緊密關聯的庫增長得更多,而向前兼容的需要意味著儘管增加的東西很多,拿掉的卻很少。任何重量級的軟體都是被詛咒過的,這個詛咒便是:要生存,必須變得流行;而在逐漸流行的過程中,軟體不能有任何改變或打破原來依賴它的東西。如果軟體可以從一開始就做得完美,這當然沒有問題,但軟體開發不是這樣的。所有軟體的進展都是一次嘗試,試圖把事情做正確,每一次嘗試也都有或多或少的成功。即使一款軟體在第一次發行時是完美的,用戶也會找到使用軟體的新方法(或者使用軟體的環境會發生變化),從而使它不再完美。因此,我們(程式設計師們)都努力把軟體做得更好,這意味著我們會增加東西,而這又意味著久而久之,所有的軟體都會面臨髒亂堆砌的命運。
本書是一次從Java(包括語言和環境)中挑選出最精良的部分,並就如何使用這部分內容以及它們為什麼是精華進行討論的嘗試。但這不是說本書中沒有討論的那些部分都不好;只是說我將要討論的這些精良部分能把Java 與其他許多語言區別開來,使得Java對我和許多軟體開發者的工作都頗有價值。
Java與我
我個人與Java 相伴的歷史可以追溯到1992 年3 月,當我剛加入Sun 實驗室注1 的時候,注1 : 正式的名稱是“Sun 微系統實驗室”(Sun Microsystems Laboratories, Inc)。實驗室有一個秘密項目,項目的一部分涉及一種新的程式語言。這門當時稱為Oak 的語言是C++ 語言的變種,被設計運行於嵌入式設備上,但它看起來卻有成為通用程式語言的苗頭。那時有許多項目在尋求其他的面向對象系統語言,當時這個家族的主導語言是C++,但C++ 已開始變得複雜,人們對這種逐漸累積起來的複雜性產生了極大的不滿(而這還是在模板加入到C++ 之前)。
我看了一下Oak 語言,那時它似乎太不穩定了,因為我正在著手做分散式系統方面的工作,可它無法成為我的合適工具。如果我們在自己的工作中採用它,那又將出現一次當時實驗室里稱為“33 號錯誤”的典型,這個錯誤是指一個研究項目的成功基於另一個研究項目(而且迄今尚未完成的項目)的成功。把語言文檔歸置好,我的項目組繼續進行我們在Modula-3 注2 方面的研究。
那是18 個月後在一次稱為“語言日”的內部審查活動中,我見到了Java,那時Oak 語
言是那個更早的、更大的嵌入式項目中唯一存活下來的部分,項目組也搬進了Sun 實驗室,
並把這裡作為它的組織家園。Sun 實驗室的主任Burt Sutherland 意識到在他的小實驗室
中至少有四種語言項目在進行,因此組織了一個語言日,讓每個項目都可以在這一天展
示一下。他希望給每個項目一些展現的機會,或許還希望促進跨項目的橫向交流、學習
和整合。作為另一個使用第五種語言的項目主管,我也被邀請參加。
我並不確知“語言日”的官方結果是什麼,但它確實讓我對Oak 刮目相看了,比起我上次見到時,它已經在成熟度和穩定性方面取得了長足進步。當時我的項目組正在尋找一種新的語言,因為我們越來越難獲得來自Modula-3 團隊的支持。於是我們決定把研究中使用的語言轉向Oak。此時,這看起來只是“33 號錯誤”的一個微不足道(只是有一點冒險)的實例了。我記得自己寫了一封郵件給實驗室主任,表明在我的項目組中使用Oak 是可接受的,因為作為一個研究性項目組,我們完全可以使用尚不具有商業可行性的語言。
幾個月之後,Oak 就成了Java,以小應用程式(applet)的形式首次出現在了瀏覽器中,而Java 作為一種語言和環境便爆發了。我成了一個負責描繪語言發展道路的公司級團隊(由Bill Joy 領導)中的一員。他們也要求我參加另一個對語言進行初次正規審查的項目組,這次審查導致了一些語言基礎設計方面的改變。
很難忘記那些日子,Java 從一種晦澀的程式語言一夜之間成了奇蹟。對那些知曉Java 語言的一切,或只想參與這份激動的人來說,它成就了一段同舟共濟的經歷。那也正是全球資訊網(World Wide Web)獲得幾何級增長的日子,而Web 的成長和Java 的成長在某種注2 : Modula-3 是20 世紀80 年代末由DEC 和Olivetti 兩家公司開發的一種程式語言,派生自Modula-2。——譯者注程度上似乎交織在一起了。Java 語言的發展成了全國性的新聞,在我的記憶里,那是空前絕後的。
我的項目組很快被調離了Sun 實驗室,成為Java 軟體組織東海岸分部的核心,致力於Java 語言的一些分散式庫的開發。在過去15 年中,我在Sun 公司的各個部門之間四處遊蕩(如今又回到了開始的地方:Sun 實驗室),使用的主要語言卻從未改變。我參與了關於將哪些內容添加到語言和庫中的內部討論,見證了JCP(Java Community Process,Java 社區進程)的形成,看到了整個平台被劃分成企業版、標準版和微型版。我在JavaOne 大會所發表的演講比參加所有的JavaOne 大會次數都多,在日本、義大利和英國舉行的Java 技術大會上,我也曾發表過演講。
我曾花費了大量的時間思考:是什麼讓Java 成為工作中能獲得樂趣的語言和環境?又有語言的哪些部分會妨礙這種樂趣?我曾經為包含或排除某些特性而爭辯,有的成功了,有的失敗了。我也曾編寫了相當數量的代碼,閱讀的代碼量更多,通常都是由對Java 語言的表達力運用比我更好的工程師編寫的。Java 並非我所使用的唯一語言,但當我轉向其他語言,然後再返回來使用Java 時,感覺就像回家一樣——我總會感覺舒服,即使有一些需要轉變的習慣和需要避開的話題。
本書的讀者
本書並不打算向讀者講授Java。本書的讀者要求已熟悉Java 語言的語法和面向對象程式設計的基本概念。對於構成語言一部分的Java 庫,也要求讀者擁有相關的背景知識。本書的目的不是為讀者講授全新的內容,而是讓讀者回憶自己已經知道但可能忘卻了的內容,或者讓讀者從新的視角重新看待自己曾經思考過的內容。對那些剛剛起步的Java 新手,希望本書能向你展示一些應該首先學習的特性。你所認為的語言的精良部分可能與筆者不同,也可能你覺得筆者所喜歡的某種東西恰是使語言糟糕的特性。但如果本書能使你思考語言中哪些是好的,哪些不是那么好的,那它就達到了目的。
本書採用的約定
本書在印刷上採用如下約定:
y 斜體(Italic):表示新的術語、URL、電子郵件地址、檔案名稱和檔案擴展名。
y 等寬字型(Constant width):用於程式代碼,以及段落中引用的程式元素,如變
量或函式名、資料庫、數據類型、環境變數、語句和關鍵字。
iv | 前言
y 等寬粗體(Constant width bold):顯示命令,或其他應由用戶逐字輸入的文本。
y 等寬斜體(Constant width italic):顯示應該由用戶提供的或由上下文決定的數據來取代的部分。
使用代碼示例
本書的目的是幫助你完成工作。基本上,你可以將書中的代碼用於你的程式或文檔中。除非你直接複製大段代碼,否則無須聯繫我們並獲得許可。舉例來說,在程式中使用書中的幾段代碼無須許可。然而,出售或發布含有O’Reilly 書中示例的CD-ROM 需經許可。
引用本書中的敘述或示例代碼來回答問題也無須許可。但將書中的大量代碼合併到你的
產品文檔中則需獲得許可。
雖然我們不要求在引用本書時做著作權歸屬聲明,但如果你這樣做,我們會非常感激。著作權歸屬聲明通常包含標題、作者、發行者和ISBN。例如:“《Java 語言精粹》,Jim Waldo 著,著作權所有2010 Jim Waldo,978-0-596-80373-5。”
聯繫我們
有關本書的建議和問題,請與出版商聯繫:
美國:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中國:
北京市西城區西直門南大街2 號成銘大廈C 座807 室(100035)
奧萊利技術諮詢(北京)有限公司
我們將為本書提供主頁,在其中提供勘誤表、示例及其他附加信息。如果讀者想了解關於我們的圖書、會議、資源中心以及O’Reilly Network 更多的信息,
Safari®線上圖書
“Safari 線上圖書”是一座按需服務的數字圖書館,允許讀者方便地搜尋
7500 多套技術或藝術參考書和視頻,從而快速找到所需要的答案。
讀者只要訂閱,就可以從我們的線上圖書館中閱讀所有的頁面,觀看所有的視頻,在手
機和移動設備上讀書,在付梓之前便看到新的主題,看到正在寫作中的手稿,向作者發
反饋,複製和貼上代碼示例,管理收藏夾,下載章節,標記關鍵章節,做筆記,列印頁面,
並從其他許多節省時間的特性中受益。
O’Reilly Media 已將本書(英文版)上傳至Safari 線上圖書服務中。要獲取本書以及來
自O’Reilly 和其他出版商類似主題書籍的完整數字版。
致謝
過去15 年的Java 開發經歷給筆者帶來的最美好的體驗之一就是接觸到的那一系列人物。James Gosling 注3 創建了一種美麗的語言,並吸引了一大群工程師、管理者、市場人員及其他各種不同職位的人。他們當中有很多才華橫溢的人,也有的略遜一疇,但都是很有趣的人。有英雄,也有混球,有罪人,也有聖徒,還有介於他們之間的一些人。有一些成了好朋友,其他的成了強勁對手,但他們都為這一語言、環境,以及整個發展的歷程做出了貢獻。
注3 : James Gosling 是Java 語言之父。——譯者注
從他們當中挑選出任何一位或多位在筆者記憶中特別重要的人來致謝都是不公的,也是不完整的。儘管如此,我還是要提及一些,我印象最深、感情最真的都是那些在工作中親密接觸過的人,包括John McClain、Peter Jones 和Ann Wollrath。沒有他們,筆者對Java 的理解將和現在完全不同。
我也必須感謝我的妻子Susan Mitchell,感謝她的支持與寬容,她的鼓勵和支持(並在我可能不工作的時候允許我消失一大段時間)使得本書的出版成為可能。
任何一個像本書這種規模的項目都需要一位啦啦隊長、責罵者和共鳴板;Mike Loukides是O’Reilly 負責本書的編輯,充當了所有的這些角色,而且不止這些。在此還要感謝筆者的技術審校,他挑出了許多問題,倘若筆者不加更正而直接付梓,結果會很糟。
最後,我想以本書作為紀念獻給Sun 微系統公司,那是Java 最初開發出來的地方。在Java(和其他許多東西)的發展歷程中,儘管公司已經盡了最大的努力,但目標是什麼,已經發生了什麼,這些從來都沒有完全清晰過。不過結局還是很壯觀,真是一次苦旅,我已經在懷念它了。
目 錄
第1章 Java簡介 1
Java好在哪裡 2
第2章 類型系統 7
類型系統概述 7
為何有三種 9
內在和外表 15
使用須知 16
真實問題 18
第3章 異常 21
導常概述 21
設計理念 25
工作原理 26
使用和濫用 30
異常的另一面 33
第4章 包 37
包概述 37
包和訪問控制 40
一個例子 41
包和檔案系統 44
第5章 垃圾回收 47
垃圾回收概述 47
垃圾回收和引用 49
記憶體泄露 50
其他資源 53
第6章 Java虛擬機 61
Java虛擬機概述 61
安全性 63
可移植性 64
可移植陷阱 66
第7章 Javadoc 73
Javadoc概述 73
一個例子 75
實現文檔 80
包文檔 81
有關文檔注釋風格、編輯器的爭論 83
第8章 集合 85
集合概述 85
參數化類型 92
高級話題 98
隨機訪問 108
結束語 112
第9章 遠程方法調用和對象序列化 115
概述 116
對象序列化 127
RPC系統中的子類型 132
第10章 並發 137
並發概述 139
同步 144
原子數據 150
第11章 開發者生態環境 153
IDE 154
JUnit 156
FindBugs 160
其他工具 161
索引 163