同人類任何語言一樣,Java為我們提供了一種表達思想的方式。如操作得當,同其他方式相比,隨著問題變得愈大和愈復雜,這種表達方式的方便性和靈活性會顯露無遺。
不可將Java簡單想象成一系列特性的集合;如孤立地看,有些特性是沒有任何意義的。只有在考慮“設計”、而非考慮簡單的編碼時,才可真正體會到Java的強大。為了按這種方式理解Java,首先必須掌握它與編程的一些基本概念。本書討論了編程問題、它們為何會成為問題以及Java用以解決它們的方法。所以,我對每一章的解釋都建立在如何用語言解決一種特定類型的問題基礎上。按這種方式,我希望引導您一步一步地進入Java的世界,使其最終成為您最自然的一種語言。
貫穿本書,我試圖在您的大腦裡建立一個模型——或者說一個“知識結構”。這樣可加深對語言的理解。若遇到難解之處,應學會把它填入這個模型的對應地方,然後自行演繹出答案。事實上,學習任何語言時,腦海裡有一個現成的知識結構往往會起到事半功倍的效果。
1. 前提
本書假定讀者對編程多少有些熟悉。應已知道程序是一系列語句的集合,知道子程序/函數/宏是什麼,知道象“If”這樣的控制語句,也知道象“while”這樣的循環結構。注意這些東西在大量語言裡都是類似的。假如您學過一種宏語言,或者用過Perl之類的工具,那麼它們的基本概念並無什麼區別。總之,只要能習慣基本的編程概念,就可順利閱讀本書。當然,C/C++程序員在閱讀時能占到更多的便宜。但即使不熟悉C,一樣不要把自己排除在外(盡管以後的學習要付出更大的努力)。我會講述面向對象編程的概念,以及Java的基本控制機制,所以不用擔心自己會打不好基礎。況且,您需要學習的第一類知識就會涉及到基本的流程控制語句。
盡管經常都會談及C和C++語言的一些特性,但並沒有打算使它們成為內部參考,而是想幫助所有程序員都能正確地看待那兩種語言。畢竟,Java是從它們那裡衍生出來的。我將試著盡可能地簡化這些引用和參考,並合理地解釋一名非C/C++程序員通常不太熟悉的內容。
2. Java的學習
在我第一本書《Using C++》面市的幾乎同一時間(Osborne/McGraw-Hill於1989年出版),我開始教授那種語言。程序設計語言的教授已成為我的專業。自1989年以來,我便在世界各地見過許多昏昏欲睡、滿臉茫然以及困惑不解的面容。開始在室內面向較少的一組人授課以後,我從作業中發現了一些特別的問題。即使那些上課面帶會心的微笑或者頻頻點頭的學生,對許多問題也存在認識上的混淆。在過去幾年間的“軟件開發會議”上,由我主持C++分組討論會(現在變成了Java討論會)。有的演講人試圖在很短的時間內向聽眾灌輸過多的主題。所以到最後,盡管聽眾的水平都還可以,而且提供的材料也很充足,但仍然損失了一部分聽眾。這可能是由於問得太多了,但由於我是那些采取傳統授課方式的人之一,所以很想使每個人都能跟上講課進度。
有段時間,我編制了大量教學簡報。經過不斷的試驗和修訂(或稱“反復”,這是在Java程序設計中非常有用的一項技術),最後成功地在一門課程中集成了從我的教學經驗中總結出來的所有東西——我在很長一段時間裡都在使用。其中由一系列離散的、易於消化的小步驟組成,而且每個小課程結束後都有一些適當的練習。我目前已在Java公開研討會上公布了這一課程,大家可到http://www.BruceEckel.com了解詳情(對研討會的介紹也以CD-ROM的形式提供,具體信息可在同樣的Web站點找到)。
從每一次研討會收到的反饋都幫助我修改及重新制訂學習材料的重心,直到我最後認為它成為一個完善的教學載體為止。但本書並非僅僅是一本教科書——我嘗試在其中裝入盡可能多的信息,並按照主題進行了有序的分類。無論如何,這本書的主要宗旨是為那些獨立學習的人士服務,他們正准備深入一門新的程序設計語言,而沒有太大的可能參加此類專業研討會。
3. 目標
就象我的前一本書《Thinking in C++》一樣,這本書面向語言的教授進行了良好的結構與組織。特別地,我的目標是建立一套有序的機制,可幫助我在自己的研討會上更好地進行語言教學。在我思考書中的一章時,實際上是在想如何教好一堂課。我的目標是得到一系列規模適中的教學模塊,可以在合理的時間內教完。隨後是一些精心挑選的練習,可以在課堂上當即完成。
在這本書中,我想達到的目標總結如下:
(1) 每一次都將教學內容向前推進一小步,便於讀者在繼續後面的學習前消化前面的內容。
(2) 采用的示例盡可能簡短。當然,這樣做有時會妨礙我解決“現實世界”的問題。但我同時也發現對那些新手來說,如果他們能理解每一個細節,那麼一般會產生更大的學習興趣。而假如他們一開始就被要解決的問題的深度和廣度所震驚,那麼一般都不會收到很好的學習效果。另外在實際教學過程中,對能夠摘錄的代碼數量是有嚴重限制的。另一方面,這樣做無疑會有些人會批評我采用了“不真實的例子”,但只要能起到良好的效果,我寧願接受這一指責。
(3) 要揭示的特性按照我精心挑選的順序依次出場,而且盡可能符合讀者的思想歷程。當然,我不可能永遠都做到這一點;在那些情況下,會給出一段簡要的聲明,指出這個問題。
(4) 只把我認為有助於理解語言的東西介紹給讀者,而不是把我知道的一切東西都抖出來,這並非藏私。我認為信息的重要程度是存在一個合理的層次的。有些情況是95%的程序員都永遠不必了解的。如強行學習,只會干擾他們的正常思維,從而加深語言在他們面前表現出來的難度。以C語言為例,假如你能記住運算符優先次序表(我從來記不住),那麼就可以寫出更“聰明”的代碼。但再深入想一層,那也會使代碼的讀者/維護者感到困擾。所以忘了那些次序吧,在拿不准的時候加上括號即可。
(5) 每一節都有明確的學習重點,所以教學時間(以及練習的間隔時間)非常短。這樣做不僅能保持讀者思想的活躍,也能使問題更容易理解,對自己的學習產生更大的信心。
(6) 提供一個堅實的基礎,使讀者能充分理解問題,以便更容易轉向一些更加困難的課程和書籍。
4. 聯機文檔
由Sun微系統公司提供的Java語言和庫(可免費下載)配套提供了電子版的用戶幫助手冊,可用Web浏覽器閱讀。此外,由其他廠商開發的幾乎所有類似產品都有一套等價的文檔系統。而目前出版的與Java有關的幾乎所有書籍都重復了這份文檔。所以你要麼已經擁有了它,要麼需要下載。所以除非特別必要,否則本書不會重復那份文檔的內容。因為一般地說,用Web浏覽器查找與類有關的資料比在書中查找方便得多(電子版的東西更新也快)。只有在需要對文檔進行補充,以便你能理解一個特定的例子時,本書才會提供有關類的一些附加說明。
5. 章節
本書在設計時認真考慮了人們學習Java語言的方式。在我授課時,學生們的反映有效地幫助了我認識哪些部分是比較困難的,需特別加以留意。我也曾經一次講述了太多的問題,但得到的教訓是:假如包括了大量新特性,就需要對它們全部作出解釋,而這特別容易加深學生們的混淆。因此,我進行了大量努力,使這本書一次盡可能地少涉及一些問題。
所以,我在書中的目標是讓每一章都講述一種語言特性,或者只講述少數幾個相互關聯的特性。這樣一來,讀者在轉向下一主題時,就能更容易地消化前面學到的知識。
下面列出對本書各章的一個簡要說明,它們與我實際進行的課堂教學是對應的。
(1) 第1章:對象入門
這一章是對面向對象的程序設計(OOP)的一個綜述,其中包括對“什麼是對象”之類的基本問題的回答,並講述了接口與實現、抽象與封裝、消息與函數、繼承與合成以及非常重要的多形性的概念。這一章會向大家提出一些對象創建的基本問題,比如構建器、對象存在於何處、創建好後把它們置於什麼地方以及魔術般的垃圾收集器(能夠清除不再需要的對象)。要介紹的另一些問題還包括通過違例實現的錯誤控制機制、反應靈敏的用戶界面的多線程處理以及連網和因特網等等。大家也會從中了解到是什麼使得Java如此特別,它為什麼取得了這麼大的成功,以及與面向對象的分析與設計有關的問題。
(2) 第2章:一切都是對象
本章將大家帶到可以著手寫自己的第一個Java程序的地方,所以必須對一些基本概念作出解釋,其中包括對象“句柄”的概念;怎樣創建一個對象;對基本數據類型和數組的一個介紹;作用域以及垃圾收集器清除對象的方式;如何將Java中的所有東西都歸為一種新數據類型(類),以及如何創建自己的類;函數、自變量以及返回值;名字的可見度以及使用來自其他庫的組件;static關鍵字;注釋和嵌入文檔等等。
(3) 第3章:控制程序流程
本章開始介紹起源於C和C++,由Java繼承的所有運算符。除此以外,還要學習運算符一些不易使人注意的問題,以及涉及造型、升遷以及優先次序的問題。隨後要講述的是基本的流程控制以及選擇運算,這些是幾乎所有程序設計語言都具有的特性:用if-else實現選擇;用for和while實現循環;用break和continue以及Java的標簽式break和contiune(它們被認為是Java中“不見的gogo”)退出循環;以及用switch實現另一種形式的選擇。盡管這些與C和C++中見到的有一定的共通性,但多少存在一些區別。除此以外,所有示例都是完整的Java示例,能使大家很快地熟悉Java的外觀。
(4) 第4章:初始化和清除
本章開始介紹構建器,它的作用是擔保初始化的正確實現。對構建器的定義要涉及函數過載的概念(因為可能同時有幾個構建器)。隨後要討論的是清除過程,它並非肯定如想象的那麼簡單。用完一個對象後,通常可以不必管它,垃圾收集器會自動介入,釋放由它占據的內存。這裡詳細探討了垃圾收集器以及它的一些特點。在這一章的最後,我們將更貼近地觀察初始化過程:自動成員初始化、指定成員初始化、初始化的順序、static(靜態)初始化以及數組初始化等等。
(5) 第5章:隱藏實現過程
本章要探討將代碼封裝到一起的方式,以及在庫的其他部分隱藏時,為什麼仍有一部分處於暴露狀態。首先要討論的是package和import關鍵字,它們的作用是進行文件級的封裝(打包)操作,並允許我們構建由類構成的庫(類庫)。此時也會談到目錄路徑和文件名的問題。本章剩下的部分將討論public,private以及protected三個關鍵字、“友好”訪問的概念以及各種場合下不同訪問控制級的意義。
(6) 第6章:類再生
繼承的概念是幾乎所有OOP語言中都占有重要的地位。它是對現有類加以利用,並為其添加新功能的一種有效途徑(同時可以修改它,這是第7章的主題)。通過繼承來重復使用原有的代碼時(再生),一般需要保持“基礎類”不變,只是將這兒或那兒的東西串聯起來,以達到預期的效果。然而,繼承並不是在現有類基礎上制造新類的唯一手段。通過“合成”,亦可將一個對象嵌入新類。在這一章中,大家將學習在Java中重復使用代碼的這兩種方法,以及具體如何運用。
(7) 第7章:多形性
若由你自己來干,可能要花9個月的時間才能發現和理解多形性的問題,這一特性實際是OOP一個重要的基礎。通過一些小的、簡單的例子,讀者可知道如何通過繼承來創建一系列類型,並通過它們共有的基礎類對那個系列中的對象進行操作。通過Java的多形性概念,同一系列中的所有對象都具有了共通性。這意味著我們編寫的代碼不必再依賴特定的類型信息。這使程序更易擴展,包容力也更強。由此,程序的構建和代碼的維護可以變得更方便,付出的代價也會更低。此外,Java還通過“接口”提供了設置再生關系的第三種途徑。這兒所謂的“接口”是對對象物理“接口”一種純粹的抽象。一旦理解了多形性的概念,接口的含義就很容易解釋了。本章也向大家介紹了Java 1.1的“內部類”。
(8) 第8章:對象的容納
對一個非常簡單的程序來說,它可能只擁有一個固定數量的對象,而且對象的“生存時間”或者“存在時間”是已知的。但是通常,我們的程序會在不定的時間創建新對象,只有在程序運行時才可了解到它們的詳情。此外,除非進入運行期,否則無法知道所需對象的數量,甚至無法得知它們確切的類型。為解決這個常見的程序設計問題,我們需要擁有一種能力,可在任何時間、任何地點創建任何數量的對象。本章的宗旨便是探討在使用對象的同時用來容納它們的一些Java工具:從簡單的數組到復雜的集合(數據結構),如Vector和Hashtable等。最後,我們還會深入討論新型和改進過的Java 1.2集合庫。
(9) 第9章:違例差錯控制
Java最基本的設計宗旨之一便是組織錯誤的代碼不會真的運行起來。編譯器會盡可能捕獲問題。但某些情況下,除非進入運行期,否則問題是不會被發現的。這些問題要麼屬於編程錯誤,要麼則是一些自然的出錯狀況,它們只有在作為程序正常運行的一部分時才會成立。Java為此提供了“違例控制”機制,用於控制程序運行時產生的一切問題。這一章將解釋try、catch、throw、throws以及finally等關鍵字在Java中的工作原理。並講述什麼時候應當“擲”出違例,以及在捕獲到違例後該采取什麼操作。此外,大家還會學習Java的一些標准違例,如何構建自己的違例,違例發生在構建器中怎麼辦,以及違例控制器如何定位等等。
(10) 第10章:Java IO系統
理論上,我們可將任何程序分割為三部分:輸入、處理和輸出。這意味著IO(輸入/輸出)是所有程序最為關鍵的部分。在這一章中,大家將學習Java為此提供的各種類,如何用它們讀寫文件、內存塊以及控制台等。“老”IO和Java 1.1的“新”IO將得到著重強調。除此之外,本節還要探討如何獲取一個對象、對其進行“流式”加工(使其能置入磁盤或通過網絡傳送)以及重新構建它等等。這些操作在Java的1.1版中都可以自動完成。另外,我們也要討論Java 1.1的壓縮庫,它將用在Java的歸檔文件格式中(JAR)。
(11) 第11章:運行期類型鑒定
若只有指向基礎類的一個句柄,Java的運行期類型標鑒定(RTTI)使我們能獲知一個對象的准確類型是什麼。一般情況下,我們需要有意忽略一個對象的准確類型,讓Java的動態綁定機制(多形性)為那一類型實現正確的行為。但在某些場合下,對於只有一個基礎句柄的對象,我們仍然特別有必要了解它的准確類型是什麼。擁有這個資料後,通常可以更有效地執行一次特殊情況下的操作。本章將解釋RTTI的用途、如何使用以及在適當的時候如何放棄它。此外,Java 1.1的“反射”特性也會在這裡得到介紹。
(12) 第12章:傳遞和返回對象
由於我們在Java中同對象溝通的唯一途徑是“句柄”,所以將對象傳遞到一個函數裡以及從那個函數返回一個對象的概念就顯得非常有趣了。本章將解釋在函數中進出時,什麼才是為了管理對象需要了解的。同時也會講述String(字串)類的概念,它用一種不同的方式解決了同樣的問題。
(13) 第13章:創建窗口和程序片
Java配套提供了“抽象Windows工具包”(AWT)。這實際是一系列類的集合,能以一種可移植的形式解決視窗操縱問題。這些窗口化程序既可以程序片的形式出現,亦可作為獨立的應用程序使用。本章將向大家介紹AWT以及網上程序片的創建過程。我們也會探討AWT的優缺點以及Java 1.1在GUI方面的一些改進。同時,重要的“Java Beans”技術也會在這裡得到強調。Java Beans是創建“快速應用開發”(RAD)程序構造工具的重要基礎。我們最後介紹的是Java 1.2的“Swing”庫——它使Java的UI組件得到了顯著的改善。
(14) 第14章:多線程
Java提供了一套內建的機制,可提供對多個並發子任務的支持,我們稱其為“線程”。這線程均在單一的程序內運行。除非機器安裝了多個處理器,否則這就是多個子任務的唯一運行方式。盡管還有別的許多重要用途,但在打算創建一個反應靈敏的用戶界面時,多線程的運用顯得尤為重要。舉個例子來說,在采用了多線程技術後,盡管當時還有別的任務在執行,但用戶仍然可以毫無阻礙地按下一個按鈕,或者鍵入一些文字。本章將對Java的多線程處理機制進行探討,並介紹相關的語法。
(15) 第15章 網絡編程
開始編寫網絡應用時,就會發現所有Java特性和庫仿佛早已串聯到了一起。本章將探討如何通過因特網通信,以及Java用以輔助此類編程的一些類。此外,這裡也展示了如何創建一個Java程序片,令其同一個“通用網關接口”(CGI)程序通信;揭示了如何用C++編寫CGI程序;也講述了與Java 1.1的“Java數據庫連接”(JDBC)和“遠程方法調用”(RMI)有關的問題。
(16) 第16章 設計范式
本章將討論非常重要、但同時也是非傳統的“范式”程序設計概念。大家會學習設計進展過程的一個例子。首先是最初的方案,然後經歷各種程序邏輯,將方案不斷改革為更恰當的設計。通過整個過程的學習,大家可體會到使設計思想逐漸變得清晰起來的一種途徑。
(17) 第17章 項目
本章包括了一系列項目,它們要麼以本書前面講述的內容為基礎,要麼對以前各章進行了一番擴展。這些項目顯然是書中最復雜的,它們有效演示了新技術和類庫的應用。
有些主題似乎不太適合放到本書的核心位置,但我發現有必要在教學時討論它們,這些主題都放入了本書的附錄。
(18) 附錄A:使用非Java代碼
對一個完全能夠移植的Java程序,它肯定存在一些嚴重的缺陷:速度太慢,而且不能訪問與具體平台有關的服務。若事先知道程序要在什麼平台上使用,就可考慮將一些操作變成“固有方法”,從而顯著加快執行速度。這些“固有方法”實際是一些特殊的函數,以另一種程序設計語言寫成(目前僅支持C/C++)。Java還可通過另一些途徑提供對非Java代碼的支持,其中包括CORBA。本附錄將詳細介紹這些特性,以便大家能創建一些簡單的例子,同非Java代碼打交道。
(19) 附錄B:對比C++和Java
對一個C++程序員,他應該已經掌握了面向對象程序設計的基本概念,而且Java語法對他來說無疑是非常眼熟的。這一點是明顯的,因為Java本身就是從C++衍生而來。但是,C++和Java之間的確存在一些顯著的差異。這些差異意味著Java在C++基礎上作出的重大改進。一旦理解了這些差異,就能理解為什麼說Java是一種傑出的語言。這一附錄便是為這個目的設立的,它講述了使Java與C++明顯有別的一些重要特性。
(20) 附錄C:Java編程規則
本附錄提供了大量建議,幫助大家進行低級程序設計和代碼編寫。
(21) 附錄D:性能
通過這個附錄的學習,大家可發現自己Java程序中存在的瓶頸,並可有效地改善執行速度。
(22) 附錄E:關於垃圾收集的一些話
這個附錄講述了用於實現垃圾收集的操作和方法。
(23) 附錄F:推薦讀物
列出我感覺特別有用的一系列Java參考書。
6. 練習
為鞏固對新知識的掌握,我發現簡單的練習特別有用。所以讀者在每一章結束時都能找到一系列練習。
大多數練習都很簡單,在合理的時間內可以完成。如將本書作為教材,可考慮在課堂內完成。老師要注意觀察,確定所有學生都已消化了講授的內容。有些練習要難些,他們是為那些有興趣深入的讀者准備的。大多數練習都可在較短時間內做完,有效地檢測和加深您的知識。有些題目比較具有挑戰性,但都不會太麻煩。事實上,練習中碰到的問題在實際應用中也會經常碰到。
7. 多媒體CD-ROM
本書配套提供了一片多媒體CD-ROM,可單獨購買及使用。它與其他計算機書籍的普通配套CD不同,那些CD通常僅包含了書中用到的源碼(本書的源碼可從www.BruceEckel.com免費下載)。本CD-ROM是一個獨立的產品,包含了一周“Hads-OnJava”培訓課程的全部內容。這是一個由Bruce Eckel講授的、長度在15小時以上的課程,含500張以上的演示幻燈片。該課程建立在這本書的基礎上,所以是非常理想的一個配套產品。
CD-ROM包含了本書的兩個版本:
(1) 本書一個可打印的版本,與下載版完全一致。
(2) 為方便讀者在屏幕上閱讀和索引,CD-ROM提供了一個獨特的超鏈接版本。這些超鏈接包括:
■230個章、節和小標題鏈接
■3600個索引鏈接
CD-ROM刻錄了600MB以上的數據。我相信它已對所謂“物超所值”進行了嶄新的定義。
CD-ROM包含了本書打印版的所有東西,另外還有來自五天快速入門課程的全部材料。我相信它建立了一個新的書刊品質評定標准。
若想單獨購買此CD-ROM,只能從Web站點www.BruceEckel.com處直接訂購。
8. 源代碼
本書所有源碼都作為保留版權的免費軟件提供,可以獨立軟件包的形式獲得,亦可從http://www.BruceEckel.com下載。為保證大家獲得的是最新版本,我用這個正式站點發行代碼以及本書電子版。亦可在其他站點找到電子書和源碼的鏡像版(有些站點已在http://www.BruceEckel.com處列出)。但無論如何,都應檢查正式站點,確定鏡像版確實是最新的版本。可在課堂和其他教育場所發布這些代碼。
版權的主要目標是保證源碼得到正確的引用,並防止在未經許可的情況下,在印刷材料中發布代碼。通常,只要源碼獲得了正確的引用,則在大多數媒體中使用本書的示例都沒有什麼問題。
在每個源碼文件中,都能發現下述版本聲明文字:
16-17頁程序
可在自己的開發項目中使用代碼,並可在課堂上引用(包括學習材料)。但要確定版權聲明在每個源文件中得到了保留。
9. 編碼樣式
在本書正文中,標識符(函數、變量和類名)以粗體印刷。大多數關鍵字也采用粗體——除了一些頻繁用到的關鍵字(若全部采用粗體,會使頁面擁擠難看,比如那些“類”)。
對於本書的示例,我采用了一種特定的編碼樣式。該樣式得到了大多數Java開發環境的支持。該樣式問世已有幾年的時間,最早起源於Bjarne Stroustrup先生在《The C++ Programming Language》裡采用的樣式(Addison-Wesley 1991年出版,第2版)。由於代碼樣式目前是個敏感問題,極易招致數小時的激烈辯論,所以我在這兒只想指出自己並不打算通過這些示例建立一種樣式標准。之所以采用這些樣式,完全出於我自己的考慮。由於Java是一種形式非常自由的編程語言,所以讀者完全可以根據自己的感覺選用了適合的編碼樣式。
本書的程序是由字處理程序包括在正文中的,它們直接取自編譯好的文件。所以,本書印刷的代碼文件應能正常工作,不會造成編譯器錯誤。會造成編譯錯誤的代碼已經用注釋//!標出。所以很容易發現,也很容易用自動方式進行測試。讀者發現並向作者報告的錯誤首先會在發行的源碼中改正,然後在本書的更新版中校訂(所有更新都會在Web站點http://www.BruceEckel.com處出現)。
10. Java版本
盡管我用幾家廠商的Java開發平台對本書的代碼進行了測試,但在判斷代碼行為是否正確時,卻通常以Sun公司的Java開發平台為准。
當您讀到本書時,Sun應已發行了Java的三個重要版本:1.0,1.1及1.2(Sun聲稱每9個月就會發布一個主要更新版本)。就我看,1.1版對Java語言進行了顯著改進,完全應標記成2.0版(由於1.1已作出了如此大的修改,真不敢想象2.0版會出現什麼變化)。然而,它的1.2版看起來最終將Java推入了一個全盛時期,特別是其中考慮到了用戶界面工具。
本書主要討論了1.0和1.1版,1.2版有部分內容涉及。但在有些時候,新方法明顯優於老方法。此時,我會明顯偏向於新方法,通常教給大家更好的方法,而完全忽略老方法。然而,有的新方法要以老方法為基礎,所以不可避免地要從老方法入手。這一特點尤以AWT為甚,因為那兒不僅存在數量眾多的老式Java 1.0代碼,有的平台仍然只支持Java 1.0。我會盡量指出哪些特性是哪個版本特有的。
大家會注意到我並未使用子版本號,比如1.1.1。至本書完稿為止,Sun公司發布的最後一個1.0版是1.02;而1.1的最後版本是1.1.5(Java 1.2仍在做β測試)。在這本書中,我只會提到Java 1.0,Java 1.1及Java 1.2,避免由於子版本編號過多造成的鍵入和印刷錯誤。
11. 課程和培訓
我的公司提供了一個五日制的公共培訓課程,以本書的內容為基礎。每章的內容都代表著一堂課,並附有相應的課後練習,以便鞏固學到的知識。一些輔助用的幻燈片可在本書的配套光盤上找到,最大限度地方便各位讀者。欲了解更多的情況,請訪問:
http://www.BruceEckel.com
或發函至:
[email protected]
我的公司也提供了咨詢服務,指導客戶完成整個開發過程——特別是您的單位首次接觸Java開發的時候。
12. 錯誤
無論作者花多大精力來避免,錯誤總是從意想不到的地方冒出來。如果您認為自己發現了一個錯誤,請在源文件(可在http://www.BruceEckel.com處找到)裡指出有可能是錯誤的地方,填好我們提供的表單。將您推薦的糾錯方法通過電子函件發給[email protected]。經適當的核對與處理,Web站點的電子版以及本書的下一個印刷版本會作出相應的改正。具體格式如下:
(1) 在主題行(Subject)寫上“TIJ Correction”(去掉引號),以便您的函件進入對應的目錄。
(2) 在函件正文,采用下述形式:
find: 在這裡寫一個單行字串,以便我們搜索錯誤所在的地方
Comment: 在這裡可寫多行批注正文,最好以“here's how I think it shoud read”開頭
###
其中,“###”指出批注正文的結束。這樣一來,我自己設計的一個糾錯工具就能對原始正文來一次“搜索”,而您建議的糾錯方法會在隨後的一個窗口中彈出。
若希望在本書的下一版添加什麼內容,或對書中的練習題有什麼意見,也歡迎您指出。我們感謝您的所有意見。
13. 封面設計
《Thinking in Java》一書封面的創作靈感來源於American Arts & CraftsMovement(美洲藝術&手工藝品運動)。這一運動起始於世紀之交,1900到1920年達到了頂峰。它起源於英格蘭,具有一定的歷史背景。當時正是機器革命產生的風暴席卷整個大陸的時候,而且受到維多利亞地區強烈裝飾風格的巨大影響。Arts&Crafts強調的是原始風格,回歸自然的初衷是整個運動的核心。那時對手工制作推崇備至,手工藝人特別得到尊重。正因為如此,人們遠遠避開現代工具的使用。這場運動對整個藝術界造成了深遠的影響,直至今天仍受到人們的懷念。特別是我們面臨又一次世紀之交,強烈的懷舊情緒難免湧上心來。計算機發展至今,已走過了很長的一段路。我們更迫切地感到:軟件設計中最重要的是設計者本身,而不是流水化的代碼編制。如設計者本身的素質和修養不高,那麼最多只是“生產”代碼的工具而已。
我以同樣的眼光來看待Java:作為一種將程序員從操作系統繁瑣機制中解放出來的嘗試,它的目的是使人們成為真正的“軟件藝術家”。
無論作者還是本書的封面設計者(自孩提時代就是我的朋友)都從這一場運動中獲得了靈感。所以接下來的事情就非常簡單了,要麼自己設計,要麼直接采用來自那個時期的作品。
此外,封面向大家展示了一個收集箱,自然學者可能用它展示自己的昆蟲標本。我們認為這些昆蟲都是“對象”,全部置於更大的“收集箱”對象裡,再統一置入“封面”這個對象裡。它向我們揭示了面向對象編程技術最基本的“集合”概念。當然,作為一名程序員,大家對於“昆蟲”或“蟲”是非常敏感的(“蟲”在英語裡是Bug,後指程序錯誤)。這裡的“蟲”已被抓獲,在一只廣口瓶中殺死,最後禁閉於一個小的展覽盒裡——暗示Java有能力尋找、顯示和消除程序裡的“蟲”(這是Java最具特色的特性之一)。
14. 致謝
首先,感謝Doyle Street Cohousing Community(道爾街住房社區)容忍我花兩年的時間來寫這本書(其實他們一直都在容忍我的“胡做非為”)。非常感謝Kevin和Sonda Donovan,是他們把科羅拉多Crested Butte市這個風景優美的地方租給我,使我整個夏天都能安心寫作。感謝Crested Butte友好的居民;以及Rocky Mountain Biological Laboratory(巖石山生物實驗室),他們的工作人員總是面帶微笑。
這是我第一次找代理人出書,但卻絕沒有後悔。謝謝“摩爾文學代理公司”的Claudette Moore小姐。是她強大的信心與毅力使我最終夢想成真。
我的頭兩本書是與Osborne/McGraw-Hill出版社的編輯Jeff Pepper合作出版的。Jeff又在正確的地方和正確的時間出現在了Prentice-Hall出版社,是他為了清除了所有可能遇到的障礙,也使我感受了一次愉快的出書經歷。謝謝你,Jeff——你對我非常重要。
要特別感謝Gen Kiyooka和他的Digigami公司,我用的Web服務器就是他們提供的;也要感謝Scott Callaway,服務器是由他負責維護的。在我學習Web的過程中,一個服務器無疑是相當有價值的幫助。
謝謝Cay Horstmann(《Core Java》一書的副編輯,Prentice Hall於1997年出版)、D'Arcy Smith(Symantec公司)和Paul Tyma(《Java Primer Plus》一書的副編輯,The Waite Group於1996年出版),感謝他們幫助我澄清語言方面的一些概念。
感謝那些在“Java軟件開發會議”上我的Java小組發言的同志們,以及我教授過的那些學生,他們提出的問題使我的教案愈發成熟起來。
特別感謝Larry和Tina O'Brien,是他們將這本書和我的教學內容制成一張教學CD-ROM(關於這方面的問題,http://www.BruceEckel.com有更多的答案)。
有許多人送來了糾錯報告,我真的很感激所有這些朋友,但特別要對下面這些人說聲謝謝:Kevin Raulerson(發現了多處重大錯誤),Bob Resendes(發現的錯誤令人難以置信),John Pinto,Joe Dante,Joe Sharp,David Combs(許多語法和表達不清的地方),Dr. Robert Stephenson,Franklin Chen,Zev Griner,David Karr,Leander A. Stroschein,Steve Clark,Charles A. Lee,AustinMaher,Dennis P. Roth,Roque Oliveira,Douglas Dunn,Dejan Ristic,NeilGalarneau,David B. Malkovsky,Steve Wilkinson,以及其他許多熱心讀者。
為了使這本書在歐洲發行,Prof. Ir. Marc Meurrens進行了大量工作。
有一些技術人員曾走進我的生活,他們後來都和我成了朋友。最不尋常的是他們全是素食主義者,平時喜歡練習瑜珈功,以及另一些形式的精神訓練。我在練習了以後,覺得對我保持精力的旺盛非常有好處。他們是Kraig Brockschmidt,GenKiyooka和Andrea provaglio,是這些朋友幫我了解了Java和程序設計在意大利的情況。
顯然,在Delphi上的一些經驗使我更容易理解Java,因為它們有許多概念和語言設計決定是相通的。我的Delphi朋友提供了許多幫助,使我能夠洞察一些不易為人注意的編程環境。他們是Marco Cantu(另一個意大利人——難道會說拉丁語的人在學習Java時有得天獨厚的優勢?)、Neil Rubenking(他最喜歡瑜珈/素食/禅道,但也非常喜歡計算機)以及Zack Urlocker(是我游歷世界時碰面次數最多的一位同志)。
我的朋友Richard Hale Shaw(以及Kim)的一些意見和支持發揮了非常關鍵的作用。Richard和我花了數月的時間將教學內容合並到一起,並探討如何使學生感受到最完美的學習體驗。也要感謝KoAnn Vikoren,Eric Eaurot,DeborahSommers,Julie Shaw,Nicole Freeman,Cindy Blair,Barbara Hanscome,Regina Ridley,Alex Dunne以及MFI其他可敬的成員。
書籍設計、封面設計以及封面照片是由我的朋友Daniel Will-Harris制作的。他是一位著名的作家和設計家(http://www.WillHarris.com),在初中的時候就已顯露出了過人的數學天賦。但是,小樣是由我制作的,所以錄入錯誤都是我的。我是用Microsoft Word 97 for Windows來寫這本書,並用它生成小樣。正文字體采用的是Bitstream Carmina;標題采用Bitstream Calligraph 421(www.bitstream.com);每章開頭的符號采用的是來自P22的Leonardo Extras(http://www.p22.com);封面字體采用ITC Rennie Marckintosh。
感謝為我提供編譯器程序的一些著名公司:Borland,Microsoft,Symantec,Sybase/Powersoft/Watcom以及Sun。
特別感謝我的老師和我所有的學生(他們也是我的老師),其中最有趣的一位寫作老師是Gabrielle Rico(《Writing the Natural Way》一書的作者,Putnam於1983年出版)。
曾向我提供過支持的朋友包括(當然還不止):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以及他們的家人。最後,當然還有我的爸爸和媽媽。