本書作者 Allen Downey 與 Chris Mayfield 在版的基礎(chǔ)上做了大幅更新與擴(kuò)充,他們會(huì)告訴你怎樣把編程用作手段,來解決各種有趣的問題。每章內(nèi)容都能安排在大學(xué)課程的某一周里面,而且每章末尾都有習(xí)題,可以促使你實(shí)踐本章所學(xué)的內(nèi)容。另外,AP Computer Science A (AP 計(jì)算機(jī)科學(xué) A)考試與 Java SE Programmer I 認(rèn)證所涉及的每個(gè)話題,幾乎都會(huì)在這本書里談到。
前言 本書想要給沒有經(jīng)驗(yàn)或經(jīng)驗(yàn)較少的讀者介紹計(jì)算機(jī)科學(xué)與編程。我們會(huì)從基本的概念開始講起,每遇到新的術(shù)語,筆者都會(huì)詳細(xì)給出定義。這樣,大家就能夠循序漸進(jìn)地了解書里的每個(gè)新想法。比較大的話題,例如控制流語句及面向?qū)ο缶幊,?huì)分為多個(gè)小的范例,并用好幾章來講解。 筆者特意把這本書寫得很精簡。每章只有10 ~ 12 頁,這樣,如果當(dāng)作大學(xué)課程的教材,那么剛好能用一星期講完一章。當(dāng)然了,這本書肯定不會(huì)把Java 的所有內(nèi)容全都講到,它只會(huì)把初學(xué)者必須掌握的編程結(jié)構(gòu)與技巧展示出來。我們先從小問題與基礎(chǔ)算法開始講,逐漸過渡到面向?qū)ο蟮脑O(shè)計(jì)上面。以計(jì)算機(jī)科學(xué)領(lǐng)域的教學(xué)術(shù)語來說,這本書用的是先講過程,后講對(duì)象的教學(xué)法(也就是objects late 方法)。 本書的寫作理念 本書遵循這樣幾條原則: 每次只講一個(gè)概念 筆者把新手理解起來比較困難的話題,拆分成許多個(gè)小的步驟,每個(gè)步驟都對(duì)應(yīng)一個(gè)新的概念,我們先理解當(dāng)前講的這個(gè)概念,然后再開始談下一個(gè)概念。在Java 語言的特性與計(jì)算機(jī)科學(xué)的通用概念之間尋求平衡 這本書并不是專講Java 的,而是想用Java 語言來編寫范例代碼,以演示計(jì)算機(jī)科學(xué)之中的概念。許多章節(jié)剛開始都會(huì)從Java 語言的某項(xiàng)特性講起,但后還是會(huì)歸結(jié)到計(jì)算機(jī)科學(xué)領(lǐng)域的概念上面。 力求簡潔 筆者撰寫本書時(shí),有一項(xiàng)重要的目標(biāo),就是想寫得盡量簡短,讓學(xué)生可以在一個(gè)學(xué)期的大學(xué)課程或AP 課程里面讀完,并理解其中的內(nèi)容。 謹(jǐn)慎處理專有名詞 筆者盡可能在書中的少用術(shù)語,如果必須要用,那么一定會(huì)在使用之前先仔細(xì)給出定義。另外,筆者還會(huì)把每章所引入的新術(shù)語,在該章后的詞匯表里面總結(jié)一遍。 涵蓋各種程序開發(fā)策略 編寫程序有許多種策略,可以從下往上寫(bottom-up,自底向上),也可以從上往下寫(top-down,自頂向下),還可以采用其他寫法。筆者會(huì)演示許多種程序開發(fā)技巧,讓大家選出合適的辦法。 顧及不同程度的讀者 編寫程序的時(shí)候,我們必須知道這個(gè)程序要使用什么算法,必須確定我們要拿什么語言來寫這個(gè)程序,還必須懂得如何調(diào)試其中的錯(cuò)誤。即使你不懂這些內(nèi)容,也還是可以從頭開始慢慢學(xué),因?yàn)楣P者會(huì)在書里把這些知識(shí)以及相關(guān)的其他一些內(nèi)容,逐步講給大家聽,而且會(huì)在附錄D 里總結(jié)。 面向?qū)ο缶幊?br />有的Java 書開篇就談?lì)惡蛯?duì)象,還有一些則是先講過程式的(procedural)編程,然后逐漸過渡到面向?qū)ο蟮木幊谭绞健?br />其實(shí),Java 里面有許多面向?qū)ο蟮奶匦,都是為了解決以前那些編程語言的缺點(diǎn)而引入的,這些特性的實(shí)現(xiàn)方式,也受到這個(gè)因素影響。所以,如果不先討論從前那些編程語言有什么樣的缺點(diǎn)和問題,那么筆者就很難把Java 的某些特性解釋給大家聽。 當(dāng)然我們會(huì)盡快(也就是從第9 章開始)講解面向?qū)ο缶幊。然而筆者前面說過,這本書每次只介紹一個(gè)概念,只有把當(dāng)前這個(gè)概念講清,我們才會(huì)繼續(xù)講解下一個(gè)概念,因此,大家需要一定的時(shí)間,才會(huì)接觸到面向?qū)ο蟮哪且徊糠帧?br />在Java 語言里,如果徹底不使用面向?qū)ο蟮奶匦裕敲次覀冞B一個(gè)程序都寫不出來,即便是簡單的Hello World 程序,也要用到對(duì)象。所以,在某些情況下,筆者會(huì)把當(dāng)前必須用到的新知識(shí)點(diǎn)簡要介紹一下,等到以后正式討論該知識(shí)點(diǎn)時(shí)再詳加解釋。 讀完全書之后,你幾乎能把Java SE Programmer I 認(rèn)證所要求的每個(gè)知識(shí)點(diǎn)都了解到,還有一些補(bǔ)充課程,參見Java 官網(wǎng)的教程頁面:https://docs.oracle.com/javase/tutorial/。 這本書也適合參加AP Computer Science A(AP 計(jì)算機(jī)科學(xué)A)考試的中學(xué)生閱讀,這項(xiàng)考試的內(nèi)容包含面向?qū)ο蟮脑O(shè)計(jì)與實(shí)現(xiàn)[AP 是College Board(美國大學(xué)理事會(huì))的注冊(cè)商標(biāo)]。AP 課程的知識(shí)點(diǎn)與本書相關(guān)章節(jié)之間的對(duì)應(yīng)關(guān)系,參見https://thinkjava.org。 第二版與版的區(qū)別 新版是經(jīng)過許多年才寫成的,筆者在編寫過程中,聽取了幾十位教師與幾百名學(xué)生的意見。完整的修改情況參見本書的GitHub 網(wǎng)頁。下面列出其中比較重要的地方: 第2 ~ 4 章 筆者重新編排了第1 章的內(nèi)容,把理論部分與實(shí)踐部分調(diào)整得更合理一些。新版的第2 章與第3 章,也比舊版更加清晰。另外,筆者這次會(huì)把與方法(method)有關(guān)的知識(shí),合起來安排到一章(也就是第4 章)中,并且會(huì)給出有深度的范例。 第5 ~ 8 章 這幾章也做了大幅調(diào)整,筆者添加了許多新的范例與圖表,并刪除了一些沒有必要的內(nèi)容。這次我們提前講解字符串(把它放在數(shù)組的前面),這樣就可以在循環(huán)問題里面使用字符串了。與遞歸有關(guān)的內(nèi)容,單獨(dú)設(shè)立一章,而且這次我們拿用其中的兩節(jié),來分別介紹二進(jìn)制數(shù)與CodingBat。 第9 ~ 12 章 筆者修訂這幾章的時(shí)候,主要想把圖表與解說講得比原來更詳細(xì),F(xiàn)在的第9 章與第10 章,更加明確地突出了不可變對(duì)象與可變對(duì)象之間的區(qū)別,另外我們還添加了兩節(jié),分別講解BigInteger 與StringBuilder。其余內(nèi)容大致不變,但這次理解起來應(yīng)該會(huì)容易一些。 第13 ~ 17 章 筆者調(diào)整了第13 ~ 14 章的內(nèi)容,將ArrayList 提前講解,而且把相關(guān)的范例,統(tǒng)合到一款名叫War 的卡牌游戲下面。第15 ~ 17 章是本次全新增加的內(nèi)容,用來講解更為高級(jí)的話題,例如二維數(shù)組、圖形、異常、抽象類、接口與事件。 附錄 筆者增加了附錄B,用來更為詳細(xì)地講解文檔與Javadoc。另外三個(gè)附錄是版本來就有的,但這次的文字與排版更加清晰。 附錄簡介 本書正文里面的各章應(yīng)該按照順序閱讀,因?yàn)楹笠徽乱v的內(nèi)容構(gòu)建在前一章的基礎(chǔ)之上。書后的四個(gè)附錄則不用在意閱讀順序: 附錄A:工具 這個(gè)附錄描述怎樣下載并安裝Java,只有裝好Java,你才能在電腦上編譯Java 程序。另外,它簡單介紹了DrJava 的用法,這是一套集成開發(fā)環(huán)境(Integrated Development Environment,IDE),主要給學(xué)生使用。這份附錄還會(huì)提到檢查代碼質(zhì)量所用的Checkstyle 工具,以及編寫測(cè)試所用的JUnit 工具。 附錄B:Javadoc 一定要給自己寫的類和方法添加文檔,這樣才能讓其他開發(fā)者(也包括你自己)將來能夠明白,這些類跟方法應(yīng)該如何使用。這份附錄講的就是怎樣閱讀并編寫文檔,以及如何使用Javadoc 工具。 附錄C:圖形 Java 提供了處理圖形與動(dòng)畫的程序庫,這是兩個(gè)能夠激發(fā)學(xué)習(xí)興趣的話題。雖然這些庫所用到的面向?qū)ο笾R(shí),大家要到學(xué)完第10 章之后才能完全理解,但我們不必等到那個(gè)時(shí)候,而是可以很早就開始使用。 附錄D:調(diào)試 雖然整本書里面會(huì)提到各種調(diào)試建議,但是這份附錄之中的建議更多,它會(huì)詳細(xì)告訴你怎樣調(diào)試程序。閱讀正文的過程中,應(yīng)該經(jīng)常參考這個(gè)附錄。 范例代碼 書中的范例代碼,幾乎都可以從https://github.com/ChrisMayfield/ThinkJavaCode2訪問。Git 是一種版本控制系統(tǒng)(version control system),能夠記錄并管理項(xiàng)目之中的文件,這些受到Git 控制的文件,可以放在同一個(gè)repository(倉庫)里面(網(wǎng)址中的ThinkJavaCode2,就是這樣一個(gè)repository)。 GitHub 是一個(gè)托管服務(wù)平臺(tái),可以存放Git 倉庫,讓用戶通過網(wǎng)頁方便地訪問這些倉庫。大家可以用下面幾種方式,使用本書的范例代碼: 種辦法是點(diǎn)擊網(wǎng)頁中的Fork 按鈕,這樣就可以給GitHub 倉庫創(chuàng)建復(fù)本。如果你還沒有GitHub 賬號(hào),那么必須提前注冊(cè)。做了Fork 之后,你就有了自己的GitHub 倉庫,你可以用這個(gè)倉庫管理自己所寫的代碼。另外,你還可以對(duì)這個(gè)倉庫執(zhí)行clone 操作,把其中的文件復(fù)制到自己的電腦里面。 還有一種辦法是不對(duì)原倉庫做fork,而是直接把那個(gè)倉庫clone 下來,這樣做不需要使用GitHub 賬號(hào),但同時(shí)你也無法通過GitHub 來管理自己對(duì)代碼所做的修改。 如果你根本就不想使用Git 功能, 那么可以直接點(diǎn)擊原倉庫頁面里的Download ZIP 按鈕,或訪問https://thinkjava.org/code2zip,把所有代碼當(dāng)成一份ZIP 壓縮文件下載。 把原倉庫clone 下來, 或者把ZIP 文件解壓縮之后, 應(yīng)該就會(huì)看到ThinkJavaCode2 目錄了,其中的各個(gè)子目錄,分別對(duì)應(yīng)于本書的各章。 書中的范例代碼都是用OpenJDK 11 開發(fā)并測(cè)試的。如果你的JDK版本比這個(gè)新,那么這些代碼都能夠正常運(yùn)行,如果比這個(gè)舊,那么其中有一些代碼可能無法運(yùn)行。 書里印刷的代碼,可以用在你自己的程序或文檔之中。只要不是大量使用,就無需提前征求我們同意。比方說,拿書中的幾段代碼編寫你自己的程序,不需要提前獲得授權(quán),但是銷售或傳播OReilly 書籍里面的范例,則需征求我們同意。引用書中的內(nèi)容與范例代碼回答問題,不需要提前獲得授權(quán),但是把大量范例代碼納入你的產(chǎn)品文檔,則需征求我們同意。 我們樂意看到你在引用本書內(nèi)容時(shí)標(biāo)注資料來源,但這不是強(qiáng)制要求。如果要標(biāo)注,那么通常應(yīng)該按照標(biāo)題、作者、出版社與ISBN 的順序來寫,例如Think Java by Allen B. Downey and Chris Mayfield. (OReilly). Copyright 2020 Allen B. Downey and Chris Mayfield, 978-1-492-07250-8。 若不確定自己對(duì)范例代碼的用法是否屬于合理使用,或不確定這種用法是否需要征得我們同意,請(qǐng)聯(lián)系permissions@oreilly.com 詢問。 排版約定 本書采用下述排版約定。 斜體(Italic) 表示新術(shù)語、網(wǎng)址、電子郵件地址、文件名、文件擴(kuò)展名。 粗體(Bold) 如果正文中的某個(gè)詞會(huì)出現(xiàn)在每章后的詞匯表里面,那么這個(gè)詞在正文之中,就印成粗體。 等寬字體(Constant Width) 表示整段的程序代碼,以及正文里面提到的程序內(nèi)容,例如變量、函數(shù)、數(shù)據(jù)庫、數(shù)據(jù)類型、環(huán)境變量、語句、關(guān)鍵字等。 等寬粗體(Constant Width Bold) 表示用戶所輸入的命令或其他文本。 OReilly 在線學(xué)習(xí)平臺(tái)(OReilly Online Learning) 近40 年來,OReilly Media 致力于提供技術(shù)和商業(yè)培訓(xùn)、知識(shí)和卓越見解,來幫助眾多公司取得成功。 我們有一群獨(dú)家專家和創(chuàng)新者,他們通過圖書、文章、會(huì)議和在線學(xué)習(xí)平臺(tái)分享知識(shí)和技術(shù)。OReilly 的在線學(xué)習(xí)平臺(tái)提供按需訪問的直播培訓(xùn)課程、詳細(xì)的學(xué)習(xí)路徑、交互式編程環(huán)境,以及由OReilly 和其他200 多家出版社出版的書籍和視頻。詳情請(qǐng)?jiān)L問http://oreilly.com。 聯(lián)系方式 請(qǐng)將你對(duì)本書的評(píng)價(jià)和問題發(fā)給出版社: 美國: OReilly Media, Inc. 1005 Gravenstein Highway North Sebastopol, CA 95472 中國: 北京市西城區(qū)西直門南大街2 號(hào)成銘大廈C 座807 室(100035) 奧萊利技術(shù)咨詢(北京)有限公司 這本書還有一個(gè)專門的網(wǎng)頁,其中包含勘誤表、范例代碼,以及其他一些附加信息。這個(gè)版本的網(wǎng)址是:https://oreil.ly/think-java-2e。 涉及本書的意見與技術(shù)問題,可以發(fā)送至電子郵箱bookquestions@oreilly.com。 與我們的書籍、課程、會(huì)議、新聞等有關(guān)的詳細(xì)信息,請(qǐng)參見http://www.oreilly.com 網(wǎng)站。 我們的Facebook:http://facebook.com/oreilly。 我們的Twitter:http://twitter.com/oreillymedia。 我們的YouTube:http://www.youtube.com/oreillymedia。 致謝 這些年來,有許多人給本書提出了建議與修改意見,筆者對(duì)此深表感激。下面列出從開源4.0 版以來給本書提供幫助的人士,早前版本的貢獻(xiàn)者沒有寫在這里: Ellen Hildreth 使用本書在Wellesley College(維斯理學(xué)院)講授數(shù)據(jù)結(jié)構(gòu),并且提供了一整套建議與修改意見。 Tania Passfield 發(fā)現(xiàn)了詞匯表里面的多余術(shù)語,那些術(shù)語當(dāng)時(shí)已經(jīng)不再出現(xiàn)于正文之中。 Elizabeth Wiethoff 指出exp(x2) 的級(jí)數(shù)展開式有誤。另外,她還創(chuàng)作了本書的Ruby 版。 Matt Crawford 提出了一整套修正意見。 Chi-Yu Li 指出了書中一段范例代碼里面的拼寫問題及程序錯(cuò)誤。 Doan Thanh Nam 修正了書中的一個(gè)例子。 Muhammad Saied 把本書翻譯成阿拉伯文,并在翻譯過程中發(fā)現(xiàn)了一些錯(cuò)誤。 Marius Margowski 發(fā)現(xiàn)了范例代碼里面的一個(gè)矛盾之處。 Leslie Klein 發(fā)現(xiàn)了exp(x2) 的級(jí)數(shù)展開式之中的另一個(gè)問題,并在卡牌數(shù)組的示意圖里發(fā)現(xiàn)了一處拼寫錯(cuò)誤,此外還幫助筆者把某些練習(xí)題設(shè)計(jì)得更加清晰。 Micah Lindstrom 找到了好幾個(gè)拼寫錯(cuò)誤,并發(fā)來了修改意見。 James Riely 把LaTeX 格式的書稿移植到http://fpl.cs.depaul.edu/jriely/thinkapjava。 Peter Knaggs 把本書移植到https://www.rigwit.co.uk/think/sharp。 Heidi Gentry-Kolen 根據(jù)本書內(nèi)容制作了一些視頻(https://www.youtube.com/user/digipipeline)。 Waldo Ribeiro 提交了一份pull request,其中指出了十幾個(gè)拼寫錯(cuò)誤。 Michael Stewart 對(duì)本書前半部分內(nèi)容提出了建議。 Steven Richardson 把本書改編為在線課程,并提出了許多條建議,以提升本書的質(zhì)量。 Fazl Rahman 逐章提供了詳細(xì)的反饋信息,并針對(duì)本書的質(zhì)量提出了許多建議。 尤其感謝給本書OReilly Media 版做技術(shù)評(píng)審的Blythe Samuels、David Wisneski 與Stephen Rose。他們發(fā)現(xiàn)了很多錯(cuò)誤,并提出了許多有效的建議,幫助筆者把這本書做得更好。筆者同樣要特別感謝Marc Loy,他詳細(xì)評(píng)審了本書的OReilly Media 第二版,并給出許多想法與修正建議,還指出了一些有待澄清的地方。 許多同學(xué)提供了很好的反饋意見,包括:Ian Staton、Tanner Wernecke、Jacob Green、Rasha Abuhantash、Nick Duncan、Kylie Davidson、Shirley Jiang、Elena Trafton、Jennifer Gregorio 與 Azeem Mufti。 還有一些讀者指出了一個(gè)或多個(gè)拼寫錯(cuò)誤,他們是:Stijn Debrouwere、GuyDriesen、Andai Velican、Chris Kuszmaul、Daniel Kurikesu、Josh Donath、Rens Findhammer、Elisa Abedrapo、Yousef BaAfif、Bruce Hill、Matt Underwood、Isaac Sultan、Dan Rice、Robert Beard、Daniel Pierce、Michael Giftthaler、Chris Fox、Min Zeng、Markus Geuss、Mauricio Gonzalez、Enrico Sartirana、Kasem Satitwiwat 與Jason Miller。 如果對(duì)本書內(nèi)容有意見或想法,請(qǐng)發(fā)送至feedback@greenteapress.com。 Allen B. Downey 和Chris Mayfield
Allen Downey是Olin College of Engineering的教授。他擁有加大伯克利的計(jì)算機(jī)科學(xué)博士學(xué)位與MIT的碩士及學(xué)士學(xué)位。
Chris Mayfield是James Madison University的計(jì)算機(jī)科學(xué)副教授。他擁有普渡大學(xué)的計(jì)算機(jī)科學(xué)博士學(xué)位及猶他大學(xué)的兩個(gè)學(xué)士學(xué)位。