本書從解決實際問題的角度講解Java面向對象程序設計,提供了健壯而靈活的問題求解方式,有助于讀者了解對象的抽象原則,掌握對象的交互概念以及各種方法的使用。書中首先采用"從對象開始"的方式引導讀者,在引入大多數程序設計基本特性和結構化程序設計概念之前,先介紹設計對象和方法的基礎知識。本書重點關注問題分解和問題設計,并采用了分而治之和逐步求精的原則。這種方式與大量的習題以及實驗題相結合,為讀者提供了理論與實踐的最佳結合方案。另外,書中也講解了Java高級特性,如GUI組件(AWT和Swing)、異常、線程、文件和套接字等。全書的組織風格便于教師根據初學者的接受能力和課時安排選講適當的高級主題。本書適合作為高等院校計算機專業(yè)或相關專業(yè)的Java程序設計或面向對象程序設計課程的教材,也非常適合專業(yè)技術人員作為參考書。譯者序任何程序員都應該熟悉Java,無論你曾經是一位系統程序設計大師,還是一位擅長快速原型法的數據庫應用程序設計師,或者僅僅是一位剛剛踏入程序設計之門的初級程序員。從最初為嵌入式程序而設計的語言到現在特別適合Internet程序設計的語言,Java已經不可逆轉地成為Internet時代的主流程序設計語言之一。本書最令人心動之處莫過于它能給不同的程序員從不同的角度提供幫助。本書沒有對讀者做任何不合理的假定,而是盡量適合幾類讀者:初學編程的新手、C/C++程序員以及其他各種偉大或者平凡的語言的使用者。正因為如此,本書非常適合作為一本入門教材。作者把極為廣博的知識融入本書,為讀者學習Java提供了全面而且實用的指導。在強調面向對象的同時并沒有忽視語言細節(jié),通過各種重要提示反復提醒讀者應該注意的內容,包括語法、語義、調試和測試等。另外,每章的Java語言小結、Java庫類、實驗課、自測題以及習題,都有助于讀者在學習過程中鞏固知識并提高實際編程能力。"從對象開始"使本書免于俗套。確實,它能讓一個初學程序設計的新手很快對面向對象這個激動人心的概念有一個總體印象。這也是許多C程序員在轉向C++時難過的一關。C++最大的優(yōu)點在于它既可以是面向對象的,也可以是面向過程的。初看起來,C++提供了從面向過程到面向對象的平滑過渡,但也正是因為這一點,許多C程序員學習C++或者用C++編程達半年以上卻仍然未能清楚地理解"面向對象"的真實內涵。本書在深入Java語言的語法與語義細節(jié)之前用盡可能淺顯的語言和例子清晰而形象地向讀者展現了面向對象的概念,使讀者在尚未真正開始學習Java之前就能對面向對象程序設計有鮮明的感性認識。而本書的后續(xù)內容也一直不遺余力地不斷強化面向對象程序設計中的各個關鍵主題。學完本書,讀者真正能夠達到一個目標:學會用Java進行面向對象程序設計。本書的另一新穎之處是有配套的Web站點www.prenhall.com/morelli/,其中包括教學的輔助資源以及本書的代碼下載。另外,在書中文字以及代碼例子中多處涉及了http://starbase.trincoll.edu/,即作者所在的TrinityCollege的網站,從這里同樣可以瀏覽或下載本書的代碼。但是,譯者嘗試后發(fā)現,可能由于網站內容的調整,個別代碼或鏈接可能會失效。如果出現這種情況,請嘗試采用http://starbase.cs.trincoll.edu/。本書前言、第0章到第9章由董永樂翻譯,第10章到第16章由陳康與繆國往初譯,附錄由吳嫣翻譯。陳渝老師修改了初譯稿并對全書內容進行了整理和統校,段海新、錢芳、于潔閱讀了譯稿并提出了寶貴的修改意見。張少華、姜進磊、許超、楊武勇、錢俊、張力也參予了翻譯工作,在此一并表示感謝。限于譯者水平,譯文中的疏漏和錯誤在所難免,歡迎讀者批評指正。前言本書讀者對象本書覆蓋的內容和采用的講解方式適用于典型的計算機科學入門(CS1)課程,或者內容稍深的Java語言課程。本書也非常適用于那些轉向Java與面向對象編程的專業(yè)程序員。本書采用一種"從對象開始"的方法講述編程與問題求解,既不要求讀者有任何編程經驗,也不需要讀者事先具備任何Java或面向對象編程的知識。第二版的新增內容本書第二版在如下方面有重大改進:●統一建模語言(UML)。UML框圖貫穿全書,以幫助闡述面向對象的概念,描述我們開發(fā)的Java程序的設計過程。第一版中的許多流程圖現在已經用UML框圖代替了,同時添加了很多新的UML框圖。UML正在迅速發(fā)展成為設計面向對象程序的業(yè)界標準,所以熟悉它會非常有用。但是,使用UML的主要原因還是出于教學上的考慮,這樣更容易介紹和講授信息隱藏、繼承以及多態(tài)性等面向對象的概念?!駨娬{面向對象設計。第二版更多地強調了面向對象設計,這種變化大部分體現在開發(fā)書中涉及的例子的過程中。重新編寫了許多編程例子,以便在深入Java編碼細節(jié)之前重點關注設計。使用UML框圖有助于采用這種方式。●改變了內容的組織結構。根據前一版的評閱者和用戶的建議,本書有幾章的內容進行了調整。前兩章進行了大幅度改寫。第0章現在提供了更詳細的面向對象的概述,并且介紹了UML的主要特點,這樣有助于在深入討論Java的面向對象實現之前給學生以正確的方向指導。為了強調設計相對于編碼的重要性,第1章在介紹Java代碼之前重點講述程序設計與開發(fā)。這一章中還包括了對基本的Java語言特性的簡要概述。這樣,學生們在開始學習具體的Java例子之前就有了很好的總體認識。關于Java語言要素的組織,本書把switch語句的討論移到了第3章,與其他的選擇控制結構一起討論。本書還改寫了第11章,以便在課程中更早、更容易地使用它。為什么從對象開始本書從對象開始講授Java,早一些給初學者總體印象,讓他們有更多的時間來掌握面向對象編程的原理。我第一次在CS1課程中講授Java時,使用的是講授C和C++時所用的方法,即從基本的語言特性和結構化編程的概念開始,然后在課程中期的某個時候開始介紹面向對象。這種方法是大家都很熟悉的,因為大多數Java與C++教材都使用這種方法。這種方法的一個問題是很多學生都得不到一個總體印象。他們能弄清楚循環(huán)、if-else結構以及算術表達式,但很難把一個編程問題分解成結構良好的Java程序。另外,這種過程化的方法似乎無法利用Java面向對象的強大功能的優(yōu)勢。如果要用對待C或者Pascal的方式來對待它,那么為什么還要講授面向對象的語言呢?這樣也使我想起來當Pascal是流行的CS1課程時的相似情況。當時,初學者最大的障礙就是過程抽象,即學習過程調用與參數傳遞的基本機制,學習如何將程序設計成一系列過程的集合。"Oh!Pascal!"是我最喜歡的入門書籍,該書采用的就是典型的"從過程開始"的方式。在第1章中講述了賦值與I/O結構之后,緊接著就在第2章中講述過程與參數。然后,第3章開始講述程序設計與組織方式。直到第4章及以后才開始講述循環(huán)、if-else以及其他結構化編程的概念。現在,初學者的主要障礙在于"對象抽象"。新手程序員必須能把程序看成多個相互作用的對象的集合,而且必須學會如何將編程問題分解成多個設計良好的對象。面向對象同時包容了來自Pascal時代的過程抽象與結構化編程的概念。"從對象開始"的講授方式自頂向下講清楚了這3個重要的概念。越早介紹對象和類,學生越能更好地掌握面向對象的重要原則。面向對象(OO)是一種基本的問題求解與設計的概念,而不僅僅是另一個應該歸入教材(或課程)的中后期的語言細節(jié)。如果很晚才介紹OO的概念,就非常容易在課程進度緊張時將其略過。Java是一種非常適合介紹面向對象概念的語言。它的對象模型比C++組織得更好。在C++中,很容易繞過OO的特點并把它當成C來對待。在Java中,有很好的機會來激發(fā)關于面向對象的討論。例如,幾乎不可能不討論繼承和多態(tài)性就討論Applet。這樣,教師可以用Java的某些基本特點,如Applet,類庫和GUI組件,自然而然地引發(fā)這些討論,而不必另外準備一些使用OO概念的例子。主要特點除了"從對象開始"的方法之外,本書還有其他幾個重要特點:●統一建模語言(UML)框圖。200多個UML框圖貫穿全書,用于解釋面向對象的概念,并重點關注面向對象設計。使用UML框圖有如下幾方面的優(yōu)勢。首先,UML框圖提供了一個簡要描述類和對象的主要特性的可視化方式。讀者很容易看到一個對象的屬性和方法,它們是私有的還是公共的,這個類或對象與其他的類之間的關系是什么。第二,UML框圖為重要的面向對象概念(如繼承和多態(tài)性)提供了簡單的圖形模型。一幅圖可以替代許多文字,所以除了文字描述之外,UML框圖有助于學生們理解這些重要的概念。第三,就其在本書中的使用目的而言,UML理解起來相對容易一些并且非常直觀。第0章中用淺顯易懂的例子介紹了基本的標記法。最后,UML正在迅速成為業(yè)界標準。所以,通過本書熟悉UML可以更好地讀懂其他關于Java與面向對象設計的書籍。●CyberPet例子。CyberPet類貫穿全書,作為一個能夠運行的例子來闡述并加強重要的概念。CyberPet在第2章中以一種擬人的方式展示了對象的基本特征。每個CyberPet屬于一個類(定義),有某個狀態(tài)(實例變量),能夠執(zhí)行類似吃和睡(實例方法)這樣的行為。方法調用用于命令CyberPet吃和睡。在第3章中,著重講解了定義和使用方法與參數,與CyberPet進行通信。在后續(xù)章節(jié)中,通過CyberPet闡述了繼承、隨機性、動畫和線程等概念。一些實驗和編程練習也在豐富CyberPet的行為并使之更加復雜?!馎pplet與GUI。Applet與GUI在第4章中首次引入,并在后續(xù)章節(jié)中一直使用。顯然,Applet是學生入門的誘餌并且可以作為一種很好的激勵因素。另外,事件驅動編程(event-drivenprogramming)與圖形用戶界面(GUI)是學生們應該在CS1課程中學習的。我們早已過了那個把命令行界面作為設計應用程序的標準的時代。JavaApplet的另一個優(yōu)勢是它們從根本上講是面向對象的。要想全部掌握Applet,學生們需要理解基本的OO概念,這也正是直到第4章才講授Applet的原因。第4章中以一種很好的方式促進了關于繼承與多態(tài)性的討論?!衽涮譝eb站點。本書設計成和一個包括許多有用資源的配套Web站點配合使用。這些資源包括書中所有例子的Java代碼和Java文檔(HTML格式),補充的實驗與編程作業(yè),自動評分的在線測驗以及PowerPoint教案(部分資源為收費使用:編者注)。關于提供給教師的輔助教學資源,詳見本書末尾的"教學支持說明"?!駟栴}求解方法。全書采用問題求解教學方法,共有13個完整地開發(fā)好的"實例分析",以及其他用于闡述這種問題求解過程的大量例子?!褡詼y題。全書包括200多個自測題,答案在每章最后給出(位于章末習題之前)?!裾履┝曨}。全書一共提供了400多個章末習題,其中還有很多標明為"難題"。采用本書作為教材的教師可以得到包含習題答案的教師手冊(詳見本書末尾的"教學支持說明")?!窬幊?、調試與設計技巧。本書包含了近400個單獨標記的"技巧"(編程技巧、調試技巧、高效設計原則以及Java語言規(guī)則),言簡意賅地給出了關于編程與設計的有用信息?!?quot;實驗課"小節(jié)。從第1章開始,每一章都包含實驗課內容,非常適合有實驗環(huán)節(jié)的CS1課程。對于那些沒有實驗環(huán)節(jié)的CS1課程,這些小節(jié)也可以用于準備編程作業(yè),作為課堂上的演示或者作為其他形式的實踐作業(yè)。書中的每個實驗在配套的Web站點上都有補充資源和講義,還提供了可供選用的實驗作業(yè)?!?quot;Java庫類"小節(jié)。從第1章開始,每一章都介紹了一個或多個來自JavaAPI(ApplicationProgrammingInterface)的庫類。在前面的幾章中,這些小節(jié)用來介紹編寫簡單程序所需的工具,如I/O類與方法。在后面的幾章中,一些小節(jié)用來介紹有用的選讀內容,如用于格式化數字輸出的NumberFormat類,另外一些用來介紹程序例子和實驗課中涉及的基本GUI組件。●"面向對象設計"小節(jié)。從第1章開始,每一章都有一個關于面向對象設計的小節(jié),強調并詳述繼承、多態(tài)性與信息隱藏之類的重要概念。表1為那些希望強調面向對象設計的教師提供了應該講授的章節(jié)的清單?!?quot;Java語言小結"小節(jié)。介紹語言特性的幾章中都包含了這個小節(jié),以總結這些語言特性的基本語法和語義。表1有關面向對象的章節(jié)主題章節(jié)什么是面向對象0.7節(jié)UML概述0.8節(jié)面向對象的設計過程1.2節(jié)對象:定義、創(chuàng)建和使用第2章方法:與對象通信第3章繼承:toString()方法第3章,"面向對象設計"小節(jié)Applet中的繼承與多態(tài)性4.2節(jié)至4.4節(jié)繼承與多態(tài)性:ToggleButton第4章,"面向對象設計"小節(jié)信息隱藏第5章,"面向對象設計"小節(jié)結構化編程概念第6章,"面向對象設計"小節(jié)抽象類:Cipher第7章,"面向對象設計"小節(jié)多態(tài)性:多態(tài)排序第8章,"面向對象設計"小節(jié)(續(xù)表)主題章節(jié)模型-視圖-控制器架構第9章,"面向對象設計"小節(jié)繼承與多態(tài)性:Spider/Fly類13.6節(jié)通用Client/Server類15.7節(jié)抽象數據類型:List類第16章,"面向對象設計"小節(jié)內容組織從總體上講,全書可以劃分成三個部分。第一部分(第0章到第4章)介紹面向對象的基本概念,包括對象、類、方法、參數傳遞、信息隱藏、繼承以及多態(tài)性。雖然這幾章的重點在于面向對象而非Java的語言細節(jié),但也都包含"Java語言小結"小節(jié),總結了涉及到的語言要素。在第1章至第3章中,給學生提供了從最初的想法構造Java程序的基本程序塊。雖然就控制結構與數據類型而言,在這個階段的程序功能很有限,但其重點在于如何構造對象,以及如何通過方法調用和參數傳遞與其他對象交互。第二部分(第5章到第8章)重點關注其余語言要素,包括數據類型和操作符(見第5章)、控制結構(見第6章)、字符串(見第7章)和數組(見第8章)。當學生們理解了面向對象程序的基本結構與框架之后,講授這些語言特點相對而言會容易一些。第三部分(第9章到第16章)講解了各種高級內容,包括圖形用戶界面(見第9章)、圖形(見第10章)、異常(見第11章)、遞歸(見第12章)、線程(見第13章)、文件(見第14章)、套接字和網絡(見第15章)以及數據結構(見第16章)。教師可以根據學生的興趣有選擇地講解這幾章的內容。表2中的課程提綱取材于作者的一學期CS1課程(一學期為13周,加上一個不上課的閱讀周)。表2一學期的課程安排周主題章1面向對象,UML第0章程序設計與開發(fā)第1章2~4對象和類定義第2章方法和參數第3章選擇結構(if-else)5Applet編程第4章繼承6數據類型與操作符第5章7~8控制結構(循環(huán))第6章結構化編程9字符串處理(循環(huán))第7章10數組處理第8章11遞歸第12章12高級內容(GUI)第9章13高級內容(異常)第11章高級內容(線程)第13章注意,這幾章高級內容并不需要按順序講解。遞歸(見第12章)可以和循環(huán)(見第6章)一起講,甚至可以在循環(huán)之前講。遞歸這一章包括一些使用字符串、數組和繪制算法(分形)的例子,以及一些標準數值算法(階乘)的例子。講解遞歸的另一種方法是和字符串(見第7章)、數組(見第8章)以及圖形(見第10章)一起討論,這樣就可以同時講解遞歸和循環(huán)迭代。異常(見第11章)也可以早一些講。這一章的前幾節(jié)中的例子使用了簡單的算術運算符和基本的for循環(huán)。如果單獨介紹這些語言要素,可以緊接在第3章之后講解異常。在有關高級內容的那幾章中,有些例子用到了Applet(見第4章)和GUI(見第9章),所以這些章節(jié)在第10章(關于圖形)、第13章(關于線程)、第14章(關于文件)以及第15章(關于套接字和網絡)之前講較為理想。然而,第16章(關于數據結構)與其他高級內容的講解可以獨立于Applet和GUI。圖1給出了書中各章的主要依賴關系。