Thinking.In.Java.3rd.Edition.Chinese(簡介)

[color=blue]簡介
“上帝賦予人類說話的能力,而說話又創造了人類對宇宙的量度——思想”—Prometheus Unbound, Shelley
人類極其受那些已經成爲用來表達他們所處社會的媒介的特定語言的支配。想象一下,如果一個人可以不使用語言就能夠從本質上適應現實世界,語言僅僅是爲了解決具體的交流和反映問題時偶爾被使用到的方式,那麼我們會發現這隻能是一種幻想。事實上“真實世界”在很大程度上是不知不覺地創建於羣體的語言習慣之上的。
摘自“The Status of Linguistics As A Science”,1929, Edward Sapir。
如同任何人類語言一樣,Java提供了一種表達概念的方式。如果使用得當,隨着問題變得更龐大更復雜,這種表達媒介將會比別的可供選擇的語言要更爲簡單更爲靈活。
我們不應該將Java僅僅看作是一些特性的集合——有一些特性在孤立狀態下沒有任何意義。如果我們需要考慮設計,而不僅僅只是編碼,那麼我們可以將Java的各部分作爲一個整體來使用。而且如果要按照這種方式去理解Java,我們通常必須理解有關它的問題以及在程序設計時伴隨的問題。這本書討論的是編程問題、它們爲什麼成爲問題,以及Java已經採取的用於解決它們的方案。因此,我在每章所闡述的特性集都是基於我所看到的這一語言在解決特定類型問題時的方式。按照這種方式,我希望能夠每次引導你向前前進一點,直到Java思想意識成爲你自然不過的語言。
自始至終,我一直持這樣的觀點:你需要在頭腦中創建一個模型,用於加強對這種語言的深入理解;如果你遇到了疑問,你就能夠將它反饋給你的模型並推斷出答案。
前提條件
本書假定你對程序設計具有一定程度的熟悉:你已經知道程序是一些語句的集合,知道子程序/函數/宏的思想,知道像“if”這樣的控制語句和像“while”這樣的循環結構,等等。不過,你可能在許多地方已經學到過這些,例如使用宏語言進行程序設計或者使用像Perl這樣的工具工作。只要你的程序設計已經到達能夠自如地運用程序設計基本思想的程度,你就能夠順利閱讀本書。當然,本書對C程序員來說更容易,對於C++程序員更是如此,因此,即使你沒有實踐過這兩種語言,也不要否定自己——而應該樂於努力學習(並且,伴隨本書的多媒體光盤能夠帶領你快速學習所必需的java基礎知識)。不過,我還是會介紹面向對象(OOP)的概念和Java的基本控制機制的。
儘管經常引用參考C和C++語言的特性,但這並不是打算讓它們成爲內部註釋,而是要幫助所有的程序員正確看待這些語言,畢竟Java是從這些語言衍生而來的。我將會努力簡化這些引用參考,並且解釋我認爲一個非C/C++程序員可能不太熟悉的任何事情。

學習Java
大概在我的第一本書《Using C++》(Osborne/McGraw-Hill於1989年出版)出版發行的同一時候,我就開始教授這種語言了。講授程序設計語言已經成爲我的職業了;自1987年以來,我在世界各地的聽衆中看到有的混混欲睡、有的面無表情、有的表情迷茫。當我開始給較小的團體進行室內培訓時,在這些實踐期間我發現了一些事情。即使那些面帶微笑頻頻點頭的人也困惑於對很多問題。我發現,多年來在軟件開發會議上由我主持的C++分組討論會(後來變成Java分組討論會)中,我和其他的演講者往往是在極短的時間內告訴聽衆許多的話題。因此,最後由於聽衆的水平不同和講授教材的方式這兩方面原因,我可能最終流失了一部分聽衆。可能這樣要求得太多了,但因爲我是傳統演講的反對者之一(而且對於大多數人來說,我相信這種抵制是因爲厭倦),因此我想盡力讓每個人都可以跟得上演講的進度。
我曾經一度在相當短的時間內做了一系列不同的演講。因此,我結束了實踐和迭代(一項在Java程序設計中也能很好運行的技術)的學習。最後,我使用自己在教學實踐中學到的所有東西發展出一門課程。它以離散的、易消化的步驟以及參與討論班的形式(最理想的學習形式)解決學習問題,並且每一小節課之後都有一些練習。我公司MindView, Inc現在提供公開的和內部的Thinking in Java培訓課程;這是我們主要的介紹性培訓課程,爲以後更高級的培訓課程提供基礎。你可以到網站www.MindView.net上詳細瞭解。(培訓課程的介紹也可以在附帶的Java多媒體光盤中得到。在同樣的網站上也可以得到這些消息。)
從每個討論班獲得的反饋信息都可以幫助我去修改和重信制訂課程教材,直到我認爲它能夠成爲一個良性運轉的教學工具爲止。不過這本書並不能當作一般的培訓課程筆記;我試着在這些書頁中放入儘可能多的信息,並且將它構造成能夠引導你順利進入下一課題的結構。最重要的是,這本書是爲那些正深入一門新的程序設計語言的單個讀者而服務的。
目標
就像我前一本書《Thinking in C++》那樣,這本書是圍繞着程序設計語言的教學過程而構建的。特別地,我的目的是要建立一套機制,提供一種在自己課程培訓班中進行程序語言教學的方式。當我思索書中的一章時,我思索的是如何在培訓班上教好一堂課。我的目標是,切割出可以在合理學時內講完的篇章,隨後是適合在課堂上完成的練習作業。
在這本書中我想達到的目標是:
1.每一次只演示一個簡單步驟的材料,以便你在繼續後面的學習之前可以很容易地消化吸收每一個概念。
2.使用的示例儘可能的簡單、簡略。這樣做有時會妨礙我們解決“真實世界”的問題,但是,我發現對於初學者,通常能夠理解例子的每一個細節,而不是理解它所能夠解決的問題範疇會爲他們帶來更多的愉悅。同樣,對於在教室內吸引讀者學習的代碼數量也有嚴格限制。正因爲這些因素,我將毫無疑問地會遭到使用“玩具般的示例”的批評,但是我樂意接受那些有利於爲教育帶來益處的種種事物。

3.謹慎安排呈現特性的先後順序,以便使你在看到使用某一主題之前已經接觸過它。當然,不可能總是這樣;在這種情況下,將會給出簡潔的介紹性描述。
4.向你提供那些我認爲對理解這種程序設計語言來說是很重要的部分,而不是提供我所知道的任何事情。我相信存在一個信息重要性的層次結構,有一些事實對於95%程序員來說永遠不必知道——那些只會困擾人們並且憑添他們對程序複雜性感觸的細節。舉一個C語言的例子,如果你能夠記住操作符優先表(我從未能記住),那麼你可以寫出靈巧的代碼。但是你需要再想一想,這樣做會給讀者/維護者帶來困惑。因此忘掉優先權,在不是很清楚的時候使用圓括號就行了。
5.使每部分的重點足夠明確,以便縮短教學時間和練習時段之間的時間。這樣做不僅使聽衆在參與討論班時的思維更爲活躍和集中,而且還可以讓讀者更具有成就感。
6.給你提供堅實的基礎,使你能夠充分理解問題,以便轉入更困難的課程和書籍中。
JDK的HTML文檔
來自於Sun Microsystems公司的Java語言及其類庫(可以從java.sun.com免費下載),配套提供了電子版文檔,可使用Web瀏覽器閱讀。並且實際上,每個廠商開發的Java編譯器都有這份文檔或一套等價的文檔系統。大部分出版的Java書籍也都有這份文檔的備份。所以你或者可能已經擁有了它,或者需要下載;所以除非需要,本書不會再重複那份文檔。因爲一般來說,你用Web瀏覽器查找類的描述比你在書中查找要快得多(並且在線文檔更可能保持更新)。你僅需要參考“JDK文檔”。只有當需要對文檔進行補充,以便你能夠理解特定實例時,本書纔會提供有關類的一些附加說明。
章節
本書設計時在思想中貫穿了一件事:人們學習Java語言的方式。討論班聽衆的反饋幫助我瞭解哪些困難部分需要解釋清楚。對於這個領域,在我突然雄心勃勃並且想涵蓋如此多的特性之處,我漸漸明白——貫穿講述材料的過程中——如果涉及到許多新特性,你就需要對它們全部解釋清楚,不然這會很容易使學生感到困惑。因此,每次我就費盡大量心思介紹儘可能少的特性。
因此,本書的目標是每一章只講述一個單一特性,或者是一小組相關特性,而不必依賴於其他還沒有講述過的特性。這樣一來你在進入下一特性之前就可以消化當前知識背景中的每個部分。
下面是對本書所含章節的簡單描述,它們與我在Thinking in Java討論班上的授課和練習時段相對應的。
第1章:對象引論

(相應的講座在光盤上)。這一章是對面向對象的程序設計(OOP)的一個綜述,包括對“什麼是對象”這種基本問題的回答,接口與實現、抽象與封裝、消息與函數、繼承與組合以及非常重要的多態概念。你也可以概要了解對象生成的問題,例如構造器,對象存在於什麼地方,一旦創建好放在什麼地方,以及神奇的垃圾回收器(清除那些不再需要的對象)。還會介紹其他一些問題,包括異常的錯誤處理,響應用戶接口的多線程以及網絡和Internet。你將會知道是什麼使Java如此特別以及它爲什麼如此成功。
第2章:一切都是對象
(相應的講座在光盤上)。本章將引導你編寫自己的第一個Java程序。本章開始先綜述一些基本要素:對象引用的概念;基本數據類型和數組的簡介;對象的生存空間以及垃圾回收器清除對象的方式;怎樣將Java中的所有東西歸爲一種新的數據類型(類);創建自己類的基本要素;方法、參數以及返回值;名字可見性以及從其他類庫使用組件;static關鍵字;以及註釋和內嵌文檔。
第3章:控制程序流
(相應的一組講座在Thinking in C的光盤上)。本章以講述Java引自C / C++的所有運算符爲開始。另外,你會看到運算符的共同缺點、轉型、類型升級以及優先權。接着介紹基本的控制流程圖以及選擇操作,這實際上是任何程序設計語言都具有的特性:if-else選擇結構,for 和while循環結構,用break和continue退出循環以及Java的標註式break和標註式continue(這說明在Java中沒有“goto”),以及switch分支選擇。儘管材料大部分具有C 和C++代碼的相同思路,但還是存在一些不同之處。
第4章:初始化和清除
(相應的講座在光盤上)。本章首先介紹構造器,它用來確保正確的初始化。構造器的定義還涉及方法重載的概念(因爲你可能同時需要幾個構造器)。隨後討論的是清除過程,它並非總是如想象般的那麼簡單。通常地,當你不再使用一個對象時,可以不必管它,垃圾回收器會最終跟隨介入,釋放對象佔據的內存。這部分詳細探討了垃圾回收器以及它的一些特性。本章最後將更近地觀察初始化過程:自動成員初始化、指定成員初始化、初始化的順序、static(靜態)初始化以及數組初始化等等。
第5章:隱藏實現細節
(相應的講座在光盤上)。本章探討程序代碼被封裝到一起的方式,以及爲什麼類庫的某些部分是暴露的,而有一部分則處於隱藏狀態。首先要討論的是package和import關鍵字,它們執行文件級別上的封裝操作,並允許你構造類庫。然後探討目錄路徑和文件名的問題。本章最後部分討論public, private以及protected關鍵字、包內訪問的概念以及在不同場合下使用不同訪問控制級別的意義。
第6章:複用類
(相應的講座在光盤上)。複用類的最簡單方法是通過組合(composition)將對象嵌入到你的新類中。不過,組合不是從已有的類產生新類的唯一方式。繼承這個概念幾乎是所有

OOP語言的標準。它是對已有的類加以利用,併爲其添加新功能的一種方式(也可以是修改它,這是第7章的主題)。繼承常常用於代碼的複用,它通過保留相同的“基類”,並且只是將這兒或那兒的東西補綴起來以產生你所期望的類型。在這一章中,大家將學習在Java中組合和繼承是怎樣重用代碼的,以及具體如何運用它們。
第7章:多態
(相應的講座在光盤上)。如果靠你自己,你可能要花上9個月的時間才能發現和理解多態,這是OOP的基礎。通過一些小的、簡單的例子,你將會看到如何用繼承來創建一族類型,並通過它們共有的基類對該族類型中的對象進行操作。Java的多態可以讓你同等地對待同一族中的所有對象,這意味着你編寫的大部分代碼不必依賴特定的類型信息。這使你的代碼更具靈活性,因此,程序的構建和源代碼的維護可以變得更爲簡單,花費也更少。
第8章:接口和內部類
Java提供了專門的工具來建立設計和重用關係:接口,它是對象接口的純粹抽象。Interface不僅僅只是達到極致的抽象類,由於它允許你通過創建某個可以向上轉型到多個基類的類,因此它也實現了類似於C++“多重繼承”的變體。
首先,內部類看起來似乎是一種簡單的程序代碼隱藏機制;你只需將類放置到其他類中。不過,你將會獲悉內部類不僅僅只是這些;它可以知曉外圍類並能與之通信。你用內部類編寫的這種代碼更優雅、更清晰。不過,它是一個全新的概念,需要花費一些時間才能習慣於用內部類進行設計。
第9章:異常與錯誤處理
Java的基本設計哲學是結構不佳的代碼將不能運行。編譯器會盡可能地去捕獲問題,但有時某一問題——或者是程序員錯誤,或者作爲正常執行程序一部分的情形下自然發生的錯誤——只能在運行時被監測到和被處理。Java具有異常處理機制用來處理在程序運行時產生的任何問題。本章將解釋try、catch、throw、throws以及finally等關鍵字在Java中是怎樣運行的,什麼時刻你應當“拋”出異常,以及在捕獲到它們時應該做些什麼。另外,你還會看到Java的標準異常,如何創建自己的異常,在構造器中異常會發生什麼,以及如何在異常期間發現異常句柄。
第10章:類型檢查
當你僅持有一個對某對象基類的引用時,Java運行時類型識別(RTTI)能讓你找出這一對象的確切類型。通常地,你會需要有意識地忽略對象的確切類型,以便讓Java的動態綁定機制(多態)能夠爲那一類型實現恰當的行爲。但有時候,當你僅有對某一對象的基類引用時,能夠知道該對象的確切類型則會很有幫助。通常這些信息可以讓你更有效地執行某些特殊情況下的操作。本章還將介紹Java的反射(reflection)機制。你將會知道RTTI 和反射是什麼,它們是如何使用的,以及當不再需要RTTI時,如何避免使用。
第11章:對象的集合

一個程序如果只擁有固定數量的對象,並且這些對象的存在時間已知,那麼這個程序只會是一個非常簡單的程序。但是通常情況下,你的程序總會在不同的時刻創建出一些新的對象,而這些時刻只有在程序運行時纔可以知道。此外,除非進入運行期,否則你無法知道所需要的對象數量,以及它們的確切類型。爲了解決這個常見的程序設計問題,我們需要在任何時間、任何地點創建任何數量的對象。本章深入地探討Java所提供的集合庫:從簡單的數組到複雜的容器(數據結構),如Vector和Hashtable,以便你在使用它們時可以持有自己所需的一些對象。
第12章:Java I/O系統
理論上,你可以將任何程序都分成三部分:輸入、處理和輸出。這意味着I/O(輸入/輸出)是程序非常重要的一部分。在這一章,你將學到Java所提供的各種I/O類,用於讀寫文件、內存塊以及控制檯等。Java I/O 的演變以及JDK 1.4 的新I/O (nio) 也會給予闡明。此外,本節還展示瞭如何獲取一個對象、如何對其進行“流化”操作(使對象可以寫入磁盤或通過網絡傳送)以及如何將其重新構造, Java的對象序列化將會爲你實現這一切。另外,還將討論Java的壓縮庫,用於Java歸檔文件格式(JAR)。最後,闡述新的優化應用程序接口(API)和正則表達式。
第13章:併發
Java提供了一套內置機制,用以支持多個被稱爲“線程”的併發子任務。這些線程均在單一的程序內運行。(除非你的機器裏安裝了多個處理器,否則這將是多子任務的唯一形式)儘管任何地方都可以應用線程,但它大多是被應用於打算創建一個反應靈敏的用戶界面的情況,舉例來說,雖然有一些別的任務正在執行,但用戶仍然可以毫無阻礙地按下按鈕或者輸入數據。本章會讓你在並行程序設計原則中打下堅實的基礎。
第14章:創建窗口和Applet程序
Java配套提供了Swing GUI 類庫,它是一系列類的集合,能以一種輕便的形式處理窗口。窗口化程序既可以是萬維網applet也可以是獨立的應用程序。本章將介紹用Swing來創建程序。還展示了Applet簽名和 Java Web Start。同時還將介紹重要的“Java Beans”技術,它是創建“快速應用軟件開發”(RAD)工具的基礎。
第15章:問題發現
程序設計語言檢測機制只能讓你儘量開發出正確運行的程序。本章介紹一些工具用於解決編譯器不能解決的問題。其中向前邁出的最大一步是自動單元測試的合併。對於本書,開發了一個自定義的測試系統確保程序輸出的正確性,而且還介紹了一個實際中的標準——JUnit測試系統。開放源碼的工具Ant實現了自動構建;並且對於團隊開發,闡述說明了CVS的基本要素。對於運行時的問題報送,本章介紹了Java斷言機制(這裏演示使用的是Design by Contract)、日誌記錄API、調試器、剖析器、以及doclets(這些用於幫助發現源代碼中的問題)。
第16章: 分析和設計

面向對象的模式是一種用於程序設計的嶄新的不同以往的思想方式,而且很多人在開始學習怎樣開發OOP項目時都會遇到問題。一旦你理解了對象這個概念,而且隨着你學會按照面向對象的方式更深入地思考,你就能夠開始創建“好的”設計以充分利用OOP提供的好處。本章介紹了分析和設計的思想,以及一些解決問題的方法,用於在合理時間內開發出好的面向對象程序。本章的主題包括:UML圖及相關方法、用例、類—職責—合作(CRC)卡片、迭代開發、極限編程(XP)、開發和發展可重用的代碼的方式,以及用於向面向對象程序設計過渡(轉化)的策略。
附錄A:對象的傳遞和返回
儘管在Java中我們和對象會話的唯一方式是通過引用,但是將對象傳遞給方法以及將對象從方法返回的概念還是會有一些有趣的結果。此附錄說明當你正進入和離開方法時你需要知道哪些是用來操縱對象的,並且還演示了String類的做法,它使用的是另外一種解決問題的方法。
附錄B:Java編程指南
這個附錄收集了一些我這幾年發現和收集到的建議,當你進行低層的程序設計和編寫代碼時,能夠幫助引導你。
附錄C:補充
以下是一些從MindView處可得到的附加學習材料的說明:
1.書後面的光盤,包含Foundations for Java,seminar-on-CD,爲你學習這本書做好了準備。
2.Hands-On Java光盤的第3版本,可以從www.MindView.net網站上獲取。它是基於本書資料的一張seminar-on-CD。
3.Think in Java Seminar。MindView公司——一個主要的基於本書資料的介紹性研討會。其日程安排和註冊頁面請參見www.MindView.net。
4.Thinking in Enterprise Java,一本介紹了更先進的Java主題的書,適用於企業版程序設計。可以從www.MindView.net網站上獲得。
5.J2EE Seminar,向你介紹真實世界Web使能的以及Java的分佈式應用這些實際開發。見www.MindView.net。
6.對象設計及系統研討會。面向對象的分析、設計及技術實現。見www.MindView.net。
7.Thinking in Patterns(Java版),介紹一些更先進的、關於設計模式和問題解決技術的Java主題。可在www.MindView.net網站上獲得。
8.Thinking in Patterns Seminar。一個基於上述書籍的充滿活力的研討會。日程安排和註冊頁面可見www.MindView.net。
9.Design Consulting and Reviews。協助你的項目處於良好的狀態。
附錄D:資源
列出我發現特別有用的一系列Java書籍。

練習
在培訓班上,我發現一些極其簡單的例子對學生的完全理解很是有用,因此在每一章的最後你都會看到一些習題集。
大多數練習設計得都很簡單,可以讓學生在課堂上在合理的時間內完成這些作業,以便指導老師在查看時,可以確保所有的學生都吸收了教材的內容。有一些題目具有挑戰性,但並沒有難度很高的題目。(我想,你應該自己找出這些題目——或者更可能的是它們會自動找上門來)。
一些經過挑選的練習答案可以在The Thinking in Java Annotated Solution Guide的電子文檔中找到,或者僅需少許費用便可以從www.BruceEckel.com下載得到。
CD-ROM
本書後面配套提供的還有一張光盤。過去我一直反對將光盤附在書的後面,因爲我感覺支付了一些額外費用去獲取大容量CD上的幾千字節的源代碼不太明智,相反更喜歡讓人們到我的網站上下載這些東西。不過,你將會發現這張CD還有一些不同之處。
這張CD不包含本書的源代碼,而是提供了到www.MindView.net網站上的一個超鏈接(你並不需要鏈接CD上的地址以獲取代碼,只要直接到那個網站去找尋即可)。這樣做的原因是:在CD送往打印時,源代碼還不完整,並且這種方式可以使代碼在出現問題的任何時候都能及時得到完善和修正。
因爲本書的三個版本之間有非常顯著的變化,所以這張CD包含了HTML格式的本書的第一版和第二版,包括因前述理由而在較新的版本中被移除的,但是可能在某些情況下對你還是有用的章節。另外,你可以從www.MindView.net下載本書的當前(第三版)的HTML版本,而且它還包含了被發現並被訂正了的修訂。HTML版本的一個好處是它的索引是超鏈接的,所以對它的內容進行導航要簡單得多。
不過400+兆字節的CD大部分是一個完整的被稱爲Foundations for Java的多媒體教程。它包括了Thinking in C培訓班講座,介紹了一些Java所沿用的C語言的語法、操作及函數。此外,還包括源自我所開創並講授的Hands-On Java seminar-on-CD第二版的前七章的演講內容。儘管完整的Hands-On Java CD曾經只單獨出售(第3版本的Hands-On Java CD也是這樣,你到 www.MindView.net網站上可以獲得),我之所以決定僅包含第二版的前七章是因爲它們和該書的第三版相比沒有太大變化,因此它不僅可以向你提供這本書的基礎,而且我還希望它還能讓你感受到Hands-On Java CD(第3版)的質量和價值。
我原本打算讓Chuck Allison把作爲seminar-on-CD ROM一部分的Thinking in C創建成一個單獨產品,不過我還是決定將它和第二版本的Thinking in C++和Thinking in Java包含在一起,這樣做是爲了讓參加培訓班的、沒有太多C語言基本語法背景的人們具有連貫一致的體驗。應該拋開這種思想“我是一個聰明的程序員,我不想學習C,而想學習C++或Java,因此我會跳過C直接到C++/Java。”在到了培訓班以後,這些人漸漸明白對

C語言語法很好的理解這個先決條件很有必要。通過本書配套提供的光盤,我們相信每個參加培訓班的人都能夠事先做好充分準備。
這張CD也讓這本書獲得了更多的讀者。即使書中第三章(程序控制流)沒有介紹Java繼承自C的基本部分,但是這張CD卻進行了很好的介紹,而且它要求的學生應該具備的程序設計背景比這本書要求的還要少。並且通過Hands-On Java CD第二版中相應的講稿來貫通前七章的資料,應該可以幫助你在進入Java的學習之前打下更加紮實的基礎。這張CD也期望更多的人能夠加入Java程序設計的大軍。只有在網站www.BruceEckel.com上直接訂購後才能獲得Hands-On Java CD ROM第三版本。
源代碼
本書的所有源代碼都可以以保留版權的免費軟件的形式得到,它們是以一個單一包的形式發佈的,訪問www.BruceEckel.com網站便可獲取。爲了確保你獲得的是最新版本,這個發佈這些源代碼和本書電子版的網站是一個官方網站。你也可以在其他站點上找到這本電子書籍和這些代碼的鏡像版本(有一些站點已經在www.BruceEckel.com列出),不過你應該檢查這個官方網站以確保鏡像版本確實是最新的版本。你可以在課堂或其他的教育場所發佈這些代碼。
保留版權的主要目的是爲了確保源代碼能夠被正確地引用,並且防止在未經許可的情況下,在打印媒體中重新發布這些代碼。(只要說明是引用了這些代碼,那麼在大多數媒介中使用本書中的示例通常不是問題。)
在每個源碼文件中,都可以發現下述版本聲明文字:
This computer source code is Copyright ©2003 MindView, Inc.All Rights Reserved.
Permission to use, copy, modify, and distribute this computer source code (Source Code) and its documentation without fee and without a written agreement for the purposes set forth below is hereby granted, provided that the above copyright notice, this paragraph and the following five numbered paragraphs appear in all copies.
1. Permission is granted to compile the Source Code and to include the compiled code, in executable format only, in personal and commercial software programs.
2. Permission is granted to use the Source Code without modification in classroom situations, including in presentation materials, provided that the book "Thinking in Java" is cited as the origin.
3. Permission to incorporate the Source Code into printed
media may be obtained by contacting
MindView, Inc. 5343 Valle Vista La Mesa, California 91941
[email protected]

4. The Source Code and documentation are copyrighted by MindView, Inc. The Source code is provided without express or implied warranty of any kind, including any implied warranty of merchantability, fitness for a particular purpose or non-infringement. MindView, Inc. does not warrant that the operation of any program that includes the Source Code will be uninterrupted or error- free. MindView, Inc. makes no representation about the suitability of the Source Code or of any software that includes the Source Code for any purpose. The entire risk as to the quality and performance of any program that includes the Source code is with the user of the Source Code. The user understands that the Source Code was developed for research and instructional purposes and is advised not to rely
exclusively for any reason on the Source Code or any program that includes the Source Code. Should the Source Code or any resulting software prove defective, the user assumes the cost of all necessary servicing, repair, or correction.
5. IN NO EVENT SHALL MINDVIEW, INC., OR ITS PUBLISHER BE LIABLE TO ANY PARTY UNDER ANY LEGAL THEORY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS, OR FOR PERSONAL INJURIES, ARISING OUT OF THE USE OF THIS SOURCE CODE AND ITS DOCUMENTATION, OR ARISING OUT OF THE INABILITY TO USE ANY RESULTING PROGRAM, EVEN IF MINDVIEW, INC., OR ITS PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. MINDVIEW, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOURCE CODE AND DOCUMENTATION PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, WITHOUT ANY ACCOMPANYING
SERVICES FROM MINDVIEW, INC., AND MINDVIEW, INC. HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
Please note that MindView, Inc. maintains a web site which is the sole distribution point for electronic copies of the Source Code, http://www.BruceEckel.com (and official mirror sites), where it is freely available under the terms stated above.
If you think you've found an error in the Source Code, please submit a correction using the URL marked "feedback" in the electronic version of the book, nearest the error you've found.
你可以在自己的項目中引用這些代碼,也可以在課堂上引用它們(包括你的演示材料),只要保留每個源文件中出現的保留版權聲明即可。

編碼標準
在本書的正文中,標識符(方法、變量和類名)被設爲粗體。大多數關鍵字也被設爲粗體,但是不包括那些頻繁使用的關鍵字,例如“class”,因爲如果將它們也設爲粗體會令人十分厭煩。
對於本書中的示例,我使用了一種特定的編碼格式。此格式遵循Sun自己在所有代碼中實際使用的格式,在它的網站上你會發現這些代碼(見java.sun.com/docs/codeconv/index.html),並且似乎大多數Java開發環境都支持這種格式。如果你已經讀過我的其他著作,你會注意到Sun的編碼格式與我的一致——儘管這與我沒有什麼關係,但我還是很高興。對代碼進行格式化這個議題常常會招致幾個小時的熱烈爭論,因此我不會試圖通過自己的示例來規定正確的格式;我對我自己使用的格式有着我自己的動機。因爲Java是一種自由形式的程序設計語言,所以你可以繼續使用任何自己感覺舒服的格式。
本書中的程序都直接來自於編譯過的文件,通過文本處理器,以文本形式呈現。因此,本書打印出的代碼文件全部都能夠運行,而且無編譯錯誤。那些會引起編譯錯誤消息的錯誤已經用//!標註出來了,以便可以使用自動方法來很容易地發現並測試它們。那些被發現並被報送給作者的錯誤將首先出現在發佈的源代碼中,並隨後出現在本書的更新材料中(還會在網站www.BruceEckel.com上出現)。
Java版本
在判斷代碼行爲是否正確時,我通常以Sun公司的Java實現爲參考。
這本書聚焦在Java 2與JDK 1.4上,並使用它們進行測試。如果你需要學習在本書的本版本中沒有討論過的Java語言的先前版本,可以從網站www.BruceEckel.com自由下載本書的第一版和第二版,它們也被包含在本書所附的CD中。
錯誤
無論作者使用多少技巧去發現錯誤,有些錯誤總還是悄悄地潛藏了起來,並且經常對新讀者造成困擾。
由於機敏的讀者所提供的反饋對我是如此的有價值,因此我開發了名爲BackTalk的幾個版本的反饋系統(該系統使用幾種不同的技術,得到了Bill Venners的輔助,在其他很多人的幫助下得以實現)。在本書的電子版本(可以從www.BruceEckel.com自由下載)中,文中的每個段落都有自己唯一的URL,點擊它可以爲該特定段落產生一封將你的意見記錄到BackTalk系統的郵件。這種方式使其很容易追蹤和更新修正。如果你發現了任何你確信是錯誤的東西,請使用BackTalk系統提交錯誤以及你建議的修正。對你的幫助不勝感激。

封面故事
《Thinking in Java》的封面創作靈感來自於美國的 Arts & Crafts運動,該運動始於世紀之交,並在1900 到1920年期間達到頂峯。它起源於英格蘭,是對工業革命帶來的機器產品和維多利亞時代高度裝飾化風格的迴應。Arts & Crafts強調簡潔設計,而回歸自然是其整個運動的核心,注重手工製造以及推崇個人手工業者,可是它並不迴避使用現代工具。這和我們現今的情形有很多相似之處:世紀之交,從計算機革命的最初起源到對個人來說更精簡更意味深長的事物的演變,以及對軟件開發技能而不僅是生產程序代碼的強調。
我以同樣的眼光看待Java:嘗試將程序員從操作系統的機制中解放出來,朝着“軟件藝師”的方向發展。
本書的作者和封面設計者(他們自孩提時代就是朋友)從這次運動中獲得靈感,並且都擁有源自那個時期的或受那個時期啓發而創作的傢俱、檯燈和其他作品。
這個封面暗示的另一主題是一個收集盒,自然學家可以用它來展示他或她保存的昆蟲標本。這些昆蟲被看作是對象,被放置到“盒”這個對象當中。而盒對象本身放置到“封面對象”當中,這闡釋說明了面向對象程序設計中最爲基本的“集合”概念。當然,程序員可能不會從中得到任何幫助,只會聯想到“程序臭蟲(Bug)”;這些蟲子被捕獲並假設在標本罐中被殺死,最後禁閉於一個展示盒中,似乎暗示Java有能力發現、顯示和制服程序臭蟲(事實上,這也是它最爲強大的屬性之一)
致謝
首先感謝和我一起授課,提供諮詢和開發教學計劃的這些合作者:Andrea Provaglio, Dave Bartlett, Bill Venners, Chuck Allison, Jeremy Meyer, 和 Larry O’Brien。在我轉而繼續去竭力爲那些像我們一樣的獨立人羣開發在一起協同工作的最佳模式的時候,你們的耐心讓我感激不已。
最近,無疑是因爲有了Internet,我可以和極其衆多的人們一起合作,協助我一起努力,他們通常是在自己的家庭辦公室(home office)中工作。過去,我可能必須爲這些人們提供相當大的辦公空間,不過由於現在有了網絡、傳真以及偶爾打打的電話,我不需要額外的開銷就可以從他們的幫助中受益。在我盡力學習更好地與其他人相處的過程中,你們對我全部都很有幫助,並且我希望繼續學習怎樣使我的工作能夠通過他人的努力變得更出色。Paula Steuer在接管我偶爾的商務實踐時發揮了不可估量的價值,他使它們變得井井有條了(Paula,感謝你在我懈怠時對我的鞭笞)。Jonathan Wilcox, Esq詳細審視了我公司的組織結構,推翻了每一塊可能隱藏禍害的石頭,並且使所有事情都條理化和合法化了,這讓我們心服口服。感謝你的細心和耐心。Sharlynn Cobaugh (他發現了Paula)使自己成爲聲音處理的專家,是創建多媒體培訓CD ROM和解決其他問題的精英成員之一。感謝你在面臨難於處理的計算機問題時的堅定不移。Evan Cofsky ([email protected])已經成爲了我開發過程中的重要一員,像一隻鴨子那樣沉迷於Python程序設計語言(嗯,這樣一種混雜的隱喻可能會產生一個臃腫的Python腳本),而且解決了多種的難題,包括將BackTalk(最終?)再構造到一個email驅動的XML數據庫中。在布拉格Amaio的人們

也提出了一些方案來幫助我。Daniel Will-Harris最先受到利用Internet進行工作的啓發,因此他當然是我的所有設計方案的主要人物。
對於這項工程,我採用了另一個曾在我的頭腦中翻騰過一段時間的措施。2002年夏天,我在科羅拉多州的Crested Butte創建了一個實習項目,最初找到了兩個實習生,而最後項目結束時有5個(有2個志願者)。他們不僅爲本書做出了貢獻,而且幫助我專心致志地搞這個項目。感謝他們:JJ Badri, Ben Hindman, Mihajlo Jovanovic, Mark Welsh。Chintan Thakker能夠留下並呆到第二個實習期(貫穿本書編寫的最後處理過程及其他的工作),因此我必須在Mount Crested Butte租賃實習公寓,我們廣招志願者,最後招到了Mike Levin, Mike Shea, 和 Ian Phillips,他們都做出了貢獻。以後我可能還要再進行其它的實習項目,請訪問網站www.MindView.net查看相關消息。
感謝Doyle Street Cohousing Community(道爾街住房社區)容忍我花了兩年的時間來寫這本書(並且一直在容忍我所做的一切)。非常感謝Kevin和Sonda Donovan,在我編寫本書第一版的夏季裏,他們把位於科羅拉多州宜人的Crested Butte市裏面的住處租給了我(也感謝Kevin爲我在CB的住處所做的重新裝修)。也感謝Crested Butte友好的居民;以及Rocky Mountain Biological Laboratory(岩石山生物實驗室),讓我有賓至如歸的感覺。我在CB的瑜伽老師Maria 和 Brenda,在我編寫第三版期間幫助我保持了健康的體魄。
當老師們來提供培訓時,科羅拉多州Crested Butte的Camp4 Coffee,已經成爲了標準住所,並且在培訓班中間休息期間,它是我所遇到的最好最便宜的飲食場所。感謝我的密友Al Smith,是他使這裏成爲如此好的一個地方,成爲Crested Butte培訓期間一個如此有趣和愉快的場所。
感謝Moore Literary Agency的Claudette Moore,因爲她無比的耐心和毅力,我才能得到我真正想要的。感謝Prentice Hall的Paul Petralia不斷地爲我提供我所需要的一切,而且不厭其煩地幫我把所有事情都搞定(並容忍我所有的特殊需求)。
我的前兩本書在Osborne/McGraw-Hill出版時,Jeff Pepper是編輯。Jeff總是在Prentice Hall恰當的地點和恰當的時間出現,他將責任轉交給Paul之前,爲這些書奠定了最初的根基。感謝你,Jeff。
感謝Rolf André Klaedtke (瑞士); Martin Vlcek, Vlada & Pavel Lahoda, (布拉格);和 Marco Cantu (意大利)在我第一次自行組織的歐洲研討會巡展中對我的熱情款待。
感謝Gen Kiyooka和他的同事Digigami,他慷慨地爲我前幾年的網上授課提供了Web服務器。這是無價的輔助學習手段。
特別感謝Larry 和Tina O’Brien,他們幫助我把我的培訓課程製作成了第一版的Hands-On Java光盤。(你可以到網站www.BruceEckel.com查看更多消息。)
在我開發期間,某些開放源碼的工具已經被證明是無價的;並且每次使用它們時都會非常感激它們的創建者。Cygwin (http://www.cygwin.com)爲我解決了無數Windows不能解決的問題,並且每天我都會變得更加依賴它(如果在15年前當我的頭腦因爲使用Gnu

Emacs而搞得發懵的時候,能有這些該多好啊)。CVS 和Ant已經成爲了在我的Java開發過程必不可少的部分,現在我已經無法再返回不用它們的時代了。我現在甚至已經變得喜歡JUnit了(http://www.junit.org),因爲他們實際上已經使它成爲了“可以運轉的最簡單的事物。”IBM的 Eclipse (http://www.eclipse.org)對開發社區做出了真正傑出的貢獻,並且隨着它的不斷升級,我期望能看到它的更偉大之處(IBM是怎樣成爲潮流所向的?我肯定錯過了一份備忘錄)。Linux在開發過程中每天都要用到,特別對實習生來說尤爲如此。當然,如果我在其他地方強調得還不夠的話,我得再次重申,我經常使用Python(www.Python.org)解決問題,在我的密友Guido Van Rossum和PythonLabs那些身材臃腫愚笨的天才人物的智慧結晶的基礎上,我花費了好幾天的時間在Zope 3上進行極限編成(XP)(Tim,我現在已經把你借的鼠標加了個框,正式命名爲“TimMouse”)。你們這夥人必須到更健康的地方去喫午餐。(還要感謝整個Python社區,他們是一幫令人喫驚的人們)。
很多人向我發送修正意見,我感激所有這些人,第一版特別要感謝:Kevin Raulerson (發現無數的程序臭蟲), Bob Resendes (簡直難於置信), John Pinto, Joe Dante, Joe Sharp (三位都難於置信), David Combs (校正了許多語法和聲明), Dr. Robert Stephenson, John Cook, Franklin Chen, Zev Griner, David Karr, Leander A. Stroschein, Steve Clark, Charles A. Lee, Austin Maher, Dennis P. Roth, Roque Oliveira, Douglas Dunn, Dejan Ristic, Neil Galarneau, David B. Malkovsky, Steve Wilkinson,以及許許多多的人。本書第一版本在歐洲發行時,Marc Meurrens在電子版宣傳和製作方面都做出了巨大的努力。
感謝在第2版本中,那些使用Swing類庫幫助我重新編寫示例的人,以及其他助手:Jon Shvarts, Thomas Kirsch, Rahim Adatia, Rajesh Jain, Ravi Manthena, Banu Rajamani, Jens Brandt, Nitin Shivaram, Malcolm Davis,以及所有表示支持的人。
曾經有許多技術人員走進我的生活,他們後來都和我成了朋友。他們對影響了我,並對我來說他們是不尋常的,因爲他們平時練習瑜伽功,以及另一些形式的精神訓練,我發現這些很具有啓發性和指導意義。他們是Kraig Brockschmidt,GenKiyooka和Andrea provaglio(他幫助我瞭解了Java和程序設計在意大利的概況,現在他在美國,是MindView團隊的一員)。
對Delphi的一些理解使我更容易理解Java,這一點都不奇怪,因爲它們有許多概念和語言設計決策是相通的。我的Delphi朋友提供了許多幫助,使我能夠洞察一些非凡的編程環境。他們是Marco Cantu(另一個意大利人——難道會說拉丁語的人在學習Java時有得天獨厚的優勢?)、Neil Rubenking(直到發現喜歡計算機之前,他一直都在做瑜珈/素食/禪道),當然還有Zack Urlocker(Delphi產品經理),他是我遊歷世界時的好夥伴。
我的朋友Richard Hale Shaw(以及Kim)的洞察力和支持都很有幫助。Richard和我花了數月的時間將教學內容合併到一起,併爲參加學習的學生設計出一套完美的學習體驗。
書籍設計、封面設計以及封面照片是由我的朋友Daniel Will-Harris製作的。他是一位著名的作家和設計家(http://www.WillHarris.com),在計算機和桌面排版發明之前,他在初中的時候就常常擺弄刮擦信(rub-on letter)。他總是抱怨我的代數含糊不清。然而,要聲明的是,是我自己製作的照排好的(camera-ready)頁面,所以所有排字錯誤都應該

算到我這裏。我是用Microsoft® Word XP for Windows來編寫這本書的,並使用Adobe Acrobat製作照排頁面的。本書是直接從Acrobat PDF文件而創建的。電子時代給我們帶來了厚禮,我恰巧是在海外創作了本書第一版和第二版的最終稿——第一版是在南非的開普敦送出的,而第二版卻是在布拉格寄出的。第三版則來自科羅拉多州的Crested Butte。本書中正文字體是Georgia,標題是Verdana。封面字體是ITC Rennie Mackintosh。
特別感謝我的所有老師和我的所有學生(他們也是我的老師),其中最有趣的一位寫作老師是Gabrielle Rico(《Writing the Natural Way》一書的作者,Putnam於1983年出版)。我將一直珍藏對在Esalen所經歷的非凡的一週的記憶。
書後面的照片是我愛人Dawn McGee照的,並且是她讓我那樣地笑的。
曾向我提供過支持的朋友包括(當然還不止他們):Andrew Binstock,SteveSinofsky,JD Hildebrandt,Tom Keffer,Brian McElhinney,Brinkley Barr,《Midnight Engineering》雜誌社的Bill Gates,Larry Constantine和LucyLockwood,Greg Perry,Dan Putterman,Christi Westphal,Gene Wang,DaveMayer,David Intersimone,Andrea Rosenfield,Claire Sawyers,另一些意大利朋友(Laura Fallai,Corrado,Ilsa和Cristina Giustozzi),Chris和Laura Strand,Almquists,Brad Jerbic,Marilyng Cvitanic,Mabrys,Haflingers,Pollocks,Peter Vinci,Robbins Families,Moelter Families(和McMillans),Michael Wilk,Dave Stoner,Laurie Adams,Cranstons,Larry Fogg,Mike和Karen Sequeira,Gary Entsminger和Allison Brody,KevinDonovan和Sonda Eastlack,Chester和Shannon Andersen,Joe Lordi,Dave和Brenda Bartlett,David Lee,Rentschlers,Sudeks,Dick,Patty和Lee Eckel,Lynn和Todd以及他們的家人。當然還有我的爸爸和媽媽。

[/color]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章