便于學(xué)習(xí)的設(shè)計(jì)
● 關(guān)鍵技能與概念:每章開(kāi)頭列出要介紹的技能和概念
● 專(zhuān)家解答:以問(wèn)答形式提供附加信息和實(shí)用提示
● 編程練習(xí):示范如何運(yùn)用編程技能的緊貼實(shí)用的練習(xí)
● 自測(cè)題:每章末尾都有一些測(cè)試題,以幫助讀者扎實(shí)掌握J(rèn)ava技能
● 語(yǔ)法注釋?zhuān)菏纠a中的注釋闡述正在演示的編程技巧
《Java 11官方入門(mén)教程(第8版)》針對(duì)Java SE 11做了全面細(xì)致的更新。
《Java 11官方入門(mén)教程(第8版)》由全球著名的暢銷(xiāo)書(shū)編程作家Herbert Schildt執(zhí)筆,指導(dǎo)你立即著手編寫(xiě)Java程序。本書(shū)開(kāi)篇講解基礎(chǔ)知識(shí),分析如何創(chuàng)建、編譯和運(yùn)行Java程序;接著濃墨重彩地描述構(gòu)成Java語(yǔ)言核心的關(guān)鍵字、語(yǔ)法和結(jié)構(gòu);*后講述Java的一些高級(jí)特性,包括多線程編程、泛型、lambda表達(dá)式、模塊、Swing以及Java交互編程工具JShell。本書(shū)通俗易懂、簡(jiǎn)明扼要、詳略得當(dāng),成為全球數(shù)百萬(wàn)讀者的理想選擇。
《Java 11官方入門(mén)教程(第8版)》旨在幫助你學(xué)習(xí)Java程序設(shè)計(jì)的基礎(chǔ)知識(shí),采用循序漸進(jìn)的教學(xué)方法,安排了許多示例、自測(cè)題和編程練習(xí)。《Java 11官方入門(mén)教程(第8版)》不需要讀者具備編程經(jīng)驗(yàn),而是從最基礎(chǔ)的知識(shí),從如何編譯并運(yùn)行Java程序開(kāi)始講起。然后討論構(gòu)成Java語(yǔ)言核心的關(guān)鍵字、功能和結(jié)構(gòu)。還介紹Java的一些最重要高級(jí)功能,如多線程編程、泛型、lambda表達(dá)式和模塊。此外,《Java 11官方入門(mén)教程(第8版)》還介紹Swing基礎(chǔ)。學(xué)完《Java 11官方入門(mén)教程(第8版)》后,讀者將牢固掌握J(rèn)ava編程精髓。
值得說(shuō)明的是,《Java 11官方入門(mén)教程(第8版)》只是學(xué)習(xí)Java的起點(diǎn)。Java不僅是一些定義語(yǔ)言的元素,還包括擴(kuò)展的庫(kù)和工具來(lái)幫助開(kāi)發(fā)程序。要想成為頂尖的Java程序員,就必須掌握這些知識(shí)。讀者在學(xué)完《Java 11官方入門(mén)教程(第8版)》后,就有了足夠的知識(shí)來(lái)繼續(xù)學(xué)習(xí)Java的其他方面。
0.1 Java的發(fā)展歷程
只有少數(shù)幾種編程語(yǔ)言對(duì)程序設(shè)計(jì)帶來(lái)過(guò)根本性影響。其中,Java的影響由于迅速和廣泛而格外突出?梢院敛豢鋸埖卣f(shuō),1995年Sun公司發(fā)布的Java 1.0給計(jì)算機(jī)程序設(shè)計(jì)領(lǐng)域帶來(lái)了一場(chǎng)變革。這場(chǎng)變革迅速將Web轉(zhuǎn)變成一個(gè)高度交互的環(huán)境,也給計(jì)算機(jī)語(yǔ)言的設(shè)計(jì)設(shè)置了一個(gè)新標(biāo)準(zhǔn)。
多年來(lái),Java不斷發(fā)展、演化和修訂。和其他語(yǔ)言加入新功能的動(dòng)作遲緩不同,Java一直站在計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言的前沿,部分原因是其不斷變革的文化,部分原因是它所面對(duì)的變化。Java已經(jīng)做過(guò)或大或小的多次升級(jí)。
第一次主要升級(jí)是Java 1.1版,這次升級(jí)比較大,加入了很多新的庫(kù)元素,修訂了處理事件的方式,重新配置了1.0版本的庫(kù)中的許多功能。
第二個(gè)主要版本是Java 2,它代表Java的第二代,標(biāo)志著Java現(xiàn)代化的到來(lái)。Java 2第一個(gè)發(fā)布的版本號(hào)是1.2。Java 2在第一次發(fā)布時(shí)使用1.2版本號(hào)看上去有些奇怪。原因在于,該號(hào)碼最初指Java庫(kù)的內(nèi)部版本號(hào),后來(lái)就泛指整個(gè)版本號(hào)了。Java 2被Sun重新包裝為J2SE(Java 2 Platform Standard Edition),并且開(kāi)始把版本號(hào)應(yīng)用于該產(chǎn)品。
Java的下一次升級(jí)是J2SE 1.3,它是Java 2版本首次較大的升級(jí)。它增強(qiáng)了已有的功能,精簡(jiǎn)了開(kāi)發(fā)環(huán)境。J2SE 1.4進(jìn)一步增強(qiáng)了Java。該版本包括一些重要的新功能,如鏈?zhǔn)疆惓!⒒谕ǖ赖腎/O以及assert關(guān)鍵字。
Java的下一版本是J2SE 5,它是Java的第二次變革。以前的幾次Java升級(jí)提供的改進(jìn)雖然重要,但都是增量式的,而J2SE 5卻從該語(yǔ)言的作用域、功能和范圍等方面提供了根本性改進(jìn)。為幫助理解J2SE 5的修改程度,下面列出了J2SE 5中的一些主要新功能:
● 泛型
● 自動(dòng)裝箱/自動(dòng)拆箱
● 枚舉
● 增強(qiáng)型for循環(huán)(for-each)
● 可變長(zhǎng)度實(shí)參(varargs)
● 靜態(tài)導(dǎo)入
● 注解(annotation)
這些條目都是重要升級(jí),每個(gè)條目都代表了Java語(yǔ)言的一處重要改進(jìn)。其中,泛型、增強(qiáng)型for循環(huán)和可變長(zhǎng)度實(shí)參引入了新的語(yǔ)法元素;自動(dòng)裝箱和自動(dòng)拆箱修改了語(yǔ)法規(guī)則;注解增加了一種全新的編程注釋方法。
這些新功能的重要性反映在使用的版本號(hào)5上。從版本號(hào)的變化方式看,這一版本的Java應(yīng)該是1.5。由于新功能和變革如此之多,常規(guī)的版本號(hào)升級(jí)(從1.4到1.5)已無(wú)法標(biāo)識(shí)變化的幅度,因此Sun決定使用版本號(hào)5,以強(qiáng)調(diào)發(fā)生了重要改進(jìn)。因此將這個(gè)版本稱(chēng)為J2SE 5,將開(kāi)發(fā)工具包稱(chēng)為JDK 5。但是,為了保持和以前的一致性,Sun決定使用1.5作為內(nèi)部版本號(hào),也稱(chēng)為開(kāi)發(fā)版本號(hào)。J2SE 5中的5稱(chēng)為產(chǎn)品版本號(hào)。
之后發(fā)布的Java版本是Java SE 6,Sun再次決定修改Java平臺(tái)的名稱(chēng),把2從版本號(hào)中刪除了。Java平臺(tái)現(xiàn)在的名稱(chēng)是Java SE,官方產(chǎn)品名稱(chēng)是Java Platform Standard Edition 6,對(duì)應(yīng)的Java開(kāi)發(fā)工具包稱(chēng)為JDK 6。和J2SE 5一樣,Java SE 6中的6是指產(chǎn)品的版本號(hào),內(nèi)部的開(kāi)發(fā)版本號(hào)是1.6。
Java SE 6 建立在J2SE 5的基礎(chǔ)之上,做了進(jìn)一步的增強(qiáng)和改進(jìn)。Java SE 6并沒(méi)有對(duì)Java語(yǔ)言本身添加較大的功能,而是增強(qiáng)了API庫(kù),添加了多個(gè)新包,改進(jìn)了運(yùn)行時(shí)環(huán)境。它在漫長(zhǎng)的生命周期(Java術(shù)語(yǔ))內(nèi)經(jīng)歷了一些更新,添加了一些升級(jí)功能?傊,Java SE 6進(jìn)一步鞏固了J2SE 5建立的領(lǐng)先地位。
接下來(lái)的版本是Java SE 7,對(duì)應(yīng)的Java開(kāi)發(fā)工具包稱(chēng)為JDK 7,內(nèi)部版本號(hào)是1.7。Java SE 7是Oracle收購(gòu)Sun Microsystems之后發(fā)布的第一個(gè)主版本。Java SE 7包含許多新功能,對(duì)語(yǔ)言和API庫(kù)做了許多增強(qiáng)。Java SE 7添加的最重要功能是在Project Coin中開(kāi)發(fā)的那些功能。Project Coin的目的是確保把對(duì)Java語(yǔ)言所做的很多小改動(dòng)包含到JDK 7中,其中包括:
● 現(xiàn)在String可控制switch語(yǔ)句。
● 二進(jìn)制整型字面值。
● 在數(shù)值字面值中使用下畫(huà)線。
● 新增一種稱(chēng)為try-with-resources的try語(yǔ)句,支持自動(dòng)資源管理。
● 構(gòu)造泛型實(shí)例時(shí),通過(guò)菱形運(yùn)算符使用類(lèi)型推斷。
● 增強(qiáng)了異常處理,可以使用單個(gè)catch捕獲兩個(gè)或更多個(gè)異常(多重捕獲),并且可以對(duì)重新拋出的異常進(jìn)行更好的類(lèi)型檢查。
可以看到,雖然Project Coin中的功能被視為小改動(dòng),但是小這個(gè)詞實(shí)在不能體現(xiàn)它們所帶來(lái)的好處。特別是,try-with-resources語(yǔ)句會(huì)對(duì)大量代碼的編寫(xiě)方式產(chǎn)生深遠(yuǎn)影響。
此后的版本是Java SE 8,對(duì)應(yīng)的開(kāi)發(fā)工具包是JDK 8,內(nèi)部的開(kāi)發(fā)版本號(hào)是1.8。JDK 8表示這是對(duì)Java語(yǔ)言的一次重大升級(jí),因?yàn)楸敬紊?jí)包含了一種意義深遠(yuǎn)的新語(yǔ)言功能:lambda表達(dá)式。lambda表達(dá)式不但改變了概念化的編程方式,而且改變了Java代碼的編寫(xiě)方式。使用lambda表達(dá)式,可以簡(jiǎn)化并減少創(chuàng)建某個(gè)結(jié)構(gòu)所需的源代碼量。另外,使用lambda表達(dá)式還可將新的運(yùn)算符-> 和一種新的語(yǔ)法元素引入Java語(yǔ)言中。
除了lambda表達(dá)式,JDK 8中還新增了其他一些重要功能。例如,從JDK 8開(kāi)始,通過(guò)接口可以為指定的方法定義默認(rèn)實(shí)現(xiàn)。總之,Java SE 8擴(kuò)展了Java語(yǔ)言的功能,并且改變了Java代碼的編寫(xiě)方式,帶來(lái)的影響足夠深遠(yuǎn)。
再后的Java版本是Java SE 9,對(duì)應(yīng)的開(kāi)發(fā)工具包是JDK 9。JDK 9表示這是對(duì)Java語(yǔ)言的一次重大升級(jí),合并了對(duì)Java語(yǔ)言及其庫(kù)的重大改進(jìn)。主要的新功能是模塊,它允許指定構(gòu)成應(yīng)用程序的代碼之間的關(guān)系和依賴(lài)。模塊還給Java的訪問(wèn)控制功能添加了另一種方式。包括模塊導(dǎo)致一個(gè)新的語(yǔ)法元素、幾個(gè)新的關(guān)鍵字和各種工具改進(jìn)被添加到Java中。模塊還對(duì)API庫(kù)具有深遠(yuǎn)的影響,因?yàn)閺腏DK 9開(kāi)始,庫(kù)包現(xiàn)在組織為模塊。
除了模塊之外,JDK 9還包括幾個(gè)新功能。其中一個(gè)特別有趣的是JShell,它是一個(gè)支持交互式程序體驗(yàn)和學(xué)習(xí)的工具(有關(guān)Jshell的簡(jiǎn)介,見(jiàn)附錄D)。另一個(gè)有趣的升級(jí)是支持私有接口方法。包含它們進(jìn)一步增強(qiáng)了JDK 8對(duì)接口中默認(rèn)方法的支持。JDK 9給javadoc工具添加了搜索功能,還添加了一個(gè)新的標(biāo)記@index來(lái)支持它。與以前的版本一樣,JDK 9包含對(duì)Java API庫(kù)的許多更新和改進(jìn)。
作為一般規(guī)則,在任何Java版本中,都有令人矚目的新功能。但JDK 9廢棄了Java高度配置的一個(gè)方面:applet。從JDK 9開(kāi)始,applet不再推薦在新項(xiàng)目中使用。如第1章所述,因?yàn)閍pplet需要瀏覽器支持以及其他一些因素,JDK 9廢棄了整個(gè)applet API。
Java的下一個(gè)版本是Java SE 10 (JDK 10)。然而,在發(fā)布它之前,Java發(fā)布計(jì)劃發(fā)生了重大變化。過(guò)去,主要發(fā)行版通常間隔兩年或更長(zhǎng)時(shí)間。然而,從JDK 10開(kāi)始,發(fā)行版之間的時(shí)間明顯縮短了,F(xiàn)在預(yù)計(jì)發(fā)布將嚴(yán)格按照基于時(shí)間的計(jì)劃表進(jìn)行,主要發(fā)布版本(現(xiàn)在稱(chēng)為功能發(fā)布版本)之間的預(yù)期時(shí)間只有6個(gè)月。因此,JDK 10于2018年3月發(fā)布,也就是JDK 9發(fā)布6個(gè)月之后。這種更快的發(fā)布節(jié)奏使Java程序員能夠快速獲得新特性和改進(jìn)。當(dāng)一個(gè)新特性準(zhǔn)備好時(shí),它將成為下一個(gè)預(yù)定發(fā)行版的一部分,而不是等待兩年或更長(zhǎng)時(shí)間。
JDK 10增加的主要新語(yǔ)言特性是支持本地變量類(lèi)型推斷。有了局部變量類(lèi)型推斷,現(xiàn)在可以在初始化器的類(lèi)型中推斷局部變量的類(lèi)型,而不是顯式指定其類(lèi)型。為了支持這個(gè)新功能,將上下文敏感的標(biāo)識(shí)符var添加到Java中,作為保留類(lèi)型名。類(lèi)型推斷可以簡(jiǎn)化代碼,因?yàn)槿绻梢詮某跏蓟髦型茢嘧兞康念?lèi)型,就不需要指定多余的變量類(lèi)型。在難以識(shí)別類(lèi)型或無(wú)法顯式指定類(lèi)型的情況下,它還可以簡(jiǎn)化聲明。局部變量類(lèi)型推斷已經(jīng)成為當(dāng)代編程環(huán)境的一個(gè)常見(jiàn)部分。它包含在Java中,幫助Java跟上語(yǔ)言設(shè)計(jì)不斷發(fā)展的趨勢(shì)。除了其他一些更改外,JDK 10還重新定義了Java版本字符串,更改了版本號(hào)的含義,以便更好地與新的基于時(shí)間的發(fā)布計(jì)劃保持一致。
在撰寫(xiě)《Java 11官方入門(mén)教程(第8版)》時(shí),Java的最新版本是Java SE 11 (JDK 11)。它于2018年9月發(fā)布,比JDK 10晚了6個(gè)月。JDK 11中主要的新語(yǔ)言特性是支持在lambda表達(dá)式中使用var。此外,還向Java啟動(dòng)程序添加了另一種執(zhí)行模式,使其能夠直接執(zhí)行簡(jiǎn)單的單文件程序。JDK 11還刪除了一些特性。也許最有趣的是取消對(duì)applet的支持,這是因?yàn)閍pplet的歷史意義;仡櫼幌,applet最初是由JDK 9禁用的。隨著JDK 11的發(fā)布,applet支持已經(jīng)被移除。JDK 11還刪除了對(duì)另一種與部署相關(guān)的技術(shù)Java Web Start的支持。JDK 11中還有一個(gè)引人注目的刪除:JavaFX;這個(gè)GUI框架不再是JDK的一部分,而是成為一個(gè)獨(dú)立的開(kāi)源項(xiàng)目。因?yàn)镴DK已經(jīng)刪除了這些特性,所以《Java 11官方入門(mén)教程(第8版)》不討論它們。
關(guān)于Java演化的另一要點(diǎn)是:從2006年開(kāi)始,Java的開(kāi)源過(guò)程就開(kāi)始了。今天,JDK的開(kāi)源實(shí)現(xiàn)是可用的。開(kāi)源進(jìn)一步促進(jìn)了Java開(kāi)發(fā)的動(dòng)態(tài)性。歸根結(jié)底,Java的創(chuàng)新是安全的。Java仍然是編程界所期待的充滿(mǎn)活力、靈活的語(yǔ)言。
《Java 11官方入門(mén)教程(第8版)》中的內(nèi)容已通過(guò)JDK 11更新。然而,如前所述,Java編程的歷史是以動(dòng)態(tài)變化為標(biāo)志的。隨著對(duì)Java的學(xué)習(xí)不斷深入,用戶(hù)將希望查看后續(xù)Java發(fā)行版的每個(gè)新特性。簡(jiǎn)單地說(shuō):Java的演化還在繼續(xù)!
0.3 《Java 11官方入門(mén)教程(第8版)》的組織結(jié)構(gòu)
《Java 11官方入門(mén)教程(第8版)》采用教程式的組織結(jié)構(gòu),每一章都建立在前面的基礎(chǔ)之上!禞ava 11官方入門(mén)教程(第8版)》共分16章,每一章討論Java的一個(gè)方面!禞ava 11官方入門(mén)教程(第8版)》的特色就在于包含許多便于讀者學(xué)習(xí)的特色內(nèi)容。
● 關(guān)鍵技能與概念:每一章首先介紹一些該章中要介紹的重要技能。
● 自測(cè)題:每一章都有自測(cè)題,測(cè)試讀者學(xué)習(xí)到的知識(shí)。答案在附錄A中提供。
● 專(zhuān)家解答:每一章中都穿插一些專(zhuān)家解答,以一問(wèn)一答的形式介紹補(bǔ)充知識(shí)和要點(diǎn)。
● 編程練習(xí):每一章中都包含一兩道編程練習(xí),以幫助讀者將學(xué)到的知識(shí)應(yīng)用到實(shí)踐中。很多這樣的練習(xí)都是實(shí)際的示例,讀者可以將其用作自己的程序的起點(diǎn)。
0.4 《Java 11官方入門(mén)教程(第8版)》不需要讀者具有編程經(jīng)驗(yàn)
《Java 11官方入門(mén)教程(第8版)》假定讀者沒(méi)有任何編程經(jīng)驗(yàn)。如果讀者沒(méi)有編程經(jīng)驗(yàn),閱讀《Java 11官方入門(mén)教程(第8版)》是正確的選擇。如果讀者有一些編程經(jīng)驗(yàn),在閱讀《Java 11官方入門(mén)教程(第8版)》時(shí)可以加快速度。但要記住,Java在幾個(gè)重要的地方與其他一些流行的計(jì)算機(jī)語(yǔ)言不同,所以不要急于下結(jié)論。因此,即使讀者是經(jīng)驗(yàn)豐富的程序員,也仍然建議仔細(xì)閱讀《Java 11官方入門(mén)教程(第8版)》。
0.5 《Java 11官方入門(mén)教程(第8版)》需要的軟件環(huán)境
要編譯和運(yùn)行《Java 11官方入門(mén)教程(第8版)》提供的所有程序,需要獲得最新版本的Java Development Kit (JDK)。在撰寫(xiě)《Java 11官方入門(mén)教程(第8版)》時(shí),最新版本為JDK 11,這是Java SE 11使用的JDK版本。《Java 11官方入門(mén)教程(第8版)》第1章介紹如何獲得Java JDK。
如果讀者使用早期版本的Java,也仍然可以閱讀《Java 11官方入門(mén)教程(第8版)》,只是無(wú)法編譯和運(yùn)行使用了Java新功能的程序。
0.6 不要忘記Web上的代碼
《Java 11官方入門(mén)教程(第8版)》所有示例和編程項(xiàng)目的源代碼都可以免費(fèi)從網(wǎng)址www.oraclepressbooks.com下載,也可以掃《Java 11官方入門(mén)教程(第8版)》封底二維碼下載。
0.7 特別感謝
特別感謝《Java 11官方入門(mén)教程(第8版)》的技術(shù)編輯Danny Coward。Danny編輯過(guò)我寫(xiě)的多《Java 11官方入門(mén)教程(第8版)》籍,他的見(jiàn)解和建議總是很有價(jià)值,也很受贊賞。
0.8 進(jìn)一步學(xué)習(xí)
《Java 11官方入門(mén)教程(第8版)》是引導(dǎo)讀者進(jìn)入Herbert Schildt系列編程圖書(shū)的大門(mén),下面的一些書(shū)你也會(huì)感興趣:
Java: The Complete Reference
Herb Schildts Java Programming Cookbook
The Art of Java
Swing: a Beginners Guide
Introducing JavaFX 8 Programming
Herbert Schildt是權(quán)威的Java語(yǔ)言專(zhuān)家、暢銷(xiāo)書(shū)作家。三十多年來(lái),Herbert撰寫(xiě)的程序設(shè)計(jì)圖書(shū)在全球的銷(xiāo)量達(dá)數(shù)百萬(wàn)冊(cè),并被翻譯成多種語(yǔ)言。Herbert已撰寫(xiě)大量關(guān)于Java、C 、C和C#編程語(yǔ)言的書(shū)籍和文章,包括 《Java 9編程參考官方大全(第10版)》、Herb Schildts Java Programming Cookbook、Introducing JavaFX 8 Programming和Swing: A Beginners Guide。
Herbert對(duì)計(jì)算機(jī)的各個(gè)方面充滿(mǎn)興趣,其中投入精力最多的是計(jì)算機(jī)語(yǔ)言,尤其是計(jì)算機(jī)語(yǔ)言的標(biāo)準(zhǔn)化。Herbert是ANSI/ISO委員會(huì)的成員,參與了1989年C語(yǔ)言的標(biāo)準(zhǔn)化、1998年C 語(yǔ)言的標(biāo)準(zhǔn)化,以及2011年C 標(biāo)準(zhǔn)的更新。Herbert擁有伊利諾伊大學(xué)的學(xué)士和碩士學(xué)位。他的個(gè)人網(wǎng)站為www.HerbSchildt.com。
第1章 Java基礎(chǔ) 1
1.1 Java的歷史和基本原則 2
1.1.1 Java的起源 2
1.1.2 Java與C和C 的關(guān)系 3
1.1.3 Java對(duì)Internet的貢獻(xiàn) 3
1.1.4 Java的魔法:字節(jié)碼 4
1.1.5 超越applet 5
1.1.6 更快速的發(fā)布時(shí)間表 6
1.1.7 Java的主要術(shù)語(yǔ) 6
1.2 面向?qū)ο蟪绦蛟O(shè)計(jì) 6
1.2.1 封裝 7
1.2.2 多態(tài)性 8
1.2.3 繼承 8
1.3 Java開(kāi)發(fā)工具包 8
1.4 第一個(gè)簡(jiǎn)單的程序 9
1.4.1 輸入程序 9
1.4.2 編譯程序 10
1.4.3 逐行分析第一個(gè)程序 10
1.5 處理語(yǔ)法錯(cuò)誤 12
1.6 第二個(gè)簡(jiǎn)單程序 12
1.7 另一種數(shù)據(jù)類(lèi)型 14
1.8 兩個(gè)控制語(yǔ)句 16
1.8.1 if語(yǔ)句 16
1.8.2 for循環(huán)語(yǔ)句 18
1.9 創(chuàng)建代碼塊 19
1.10 分號(hào)和定位 20
1.11 縮進(jìn)原則 20
1.12 Java關(guān)鍵字 22
1.13 Java標(biāo)識(shí)符 23
1.14 Java類(lèi)庫(kù) 23
1.15 自測(cè)題 23
第2章 數(shù)據(jù)類(lèi)型與運(yùn)算符 25
2.1 數(shù)據(jù)類(lèi)型為什么重要 26
2.2 Java的基本類(lèi)型 26
2.2.1 整數(shù)類(lèi)型 26
2.2.2 浮點(diǎn)型 27
2.2.3 字符型 28
2.2.4 布爾類(lèi)型 29
2.3 字面值 31
2.3.1 十六進(jìn)制、八進(jìn)制和二進(jìn)制字面值 31
2.3.2 字符轉(zhuǎn)義序列 32
2.3.3 字符串字面值 32
2.4 變量詳解 33
2.4.1 初始化變量 33
2.4.2 動(dòng)態(tài)初始化 33
2.5 變量的作用域和生命期 34
2.6 運(yùn)算符 36
2.7 算術(shù)運(yùn)算符 36
2.8 關(guān)系運(yùn)算符和邏輯運(yùn)算符 37
2.9 短路邏輯運(yùn)算符 39
2.10 賦值運(yùn)算符 40
2.11 速記賦值 40
2.12 賦值中的類(lèi)型轉(zhuǎn)換 41
2.13 不兼容類(lèi)型的強(qiáng)制轉(zhuǎn)換 42
2.14 運(yùn)算符的優(yōu)先級(jí) 43
2.15 表達(dá)式 45
2.15.1 表達(dá)式中的類(lèi)型轉(zhuǎn)換 45
2.15.2 間距和圓括號(hào) 46
2.16 自測(cè)題 47
第3章 程序控制語(yǔ)句 49
3.1 從鍵盤(pán)輸入字符 50
3.2 if語(yǔ)句 51
3.2.1 嵌套if語(yǔ)句 52
3.2.2 if-else-if階梯狀結(jié)構(gòu) 53
3.3 switch語(yǔ)句 54
3.4 for循環(huán) 58
3.4.1 for循環(huán)的一些變體 60
3.4.2 缺失部分要素的for循環(huán) 61
3.4.3 無(wú)限循環(huán) 61
3.4.4 沒(méi)有循環(huán)體的循環(huán) 62
3.4.5 在for循環(huán)內(nèi)部聲明循環(huán)控制變量 62
3.4.6 增強(qiáng)型for循環(huán) 63
3.5 while循環(huán) 63
3.6 do-while循環(huán) 64
3.7 使用break語(yǔ)句退出循環(huán) 69
3.8 將break語(yǔ)句作為一種goto語(yǔ)句使用 70
3.9 使用continue語(yǔ)句 73
3.10 嵌套循環(huán) 77
3.11 自測(cè)題 78
第4章 類(lèi)、對(duì)象和方法 81
4.1 類(lèi)的基礎(chǔ)知識(shí) 82
4.1.1 類(lèi)的基本形式 82
4.1.2 定義類(lèi) 83
4.2 如何創(chuàng)建對(duì)象 85
4.3 引用變量和賦值 85
4.4 方法 86
4.5 從方法返回值 88
4.6 返回值 89
4.7 使用形參 90
4.8 構(gòu)造函數(shù) 98
4.9 帶形參的構(gòu)造函數(shù) 99
4.10 深入介紹new運(yùn)算符 100
4.11 垃圾回收 101
4.12 this關(guān)鍵字 101
4.13 自測(cè)題 103
第5章 其他數(shù)據(jù)類(lèi)型與運(yùn)算符 105
5.1 數(shù)組 106
5.2 多維數(shù)組 110
5.2.1 二維數(shù)組 110
5.2.2 不規(guī)則數(shù)組 111
5.2.3 三維或更多維的數(shù)組 112
5.2.4 初始化多維數(shù)組 112
5.3 另一種聲明數(shù)組的語(yǔ)法 113
5.4 數(shù)組引用賦值 114
5.5 使用length成員 115
5.6 for-each形式的循環(huán) 119
5.6.1 迭代多維數(shù)組 122
5.6.2 應(yīng)用增強(qiáng)型for循環(huán) 123
5.7 字符串 123
5.7.1 構(gòu)造字符串 124
5.7.2 操作字符串 124
5.7.3 字符串?dāng)?shù)組 126
5.7.4 字符串是不可變的 127
5.7.5 使用String控制switch語(yǔ)句 128
5.8 使用命令行實(shí)參 128
5.9 使用局部變量的類(lèi)型推斷功能 130
5.9.1 引用類(lèi)型的局部變量類(lèi)型推斷 131
5.9.2 在for循環(huán)中使用局部變量類(lèi)型推斷 132
5.9.3 var的一些限制 133
5.10 位運(yùn)算符 133
5.10.1 位運(yùn)算符的與、或、異或和非 134
5.10.2 移位運(yùn)算符 137
5.10.3 位運(yùn)算符的賦值速記符 139
5.11 ?運(yùn)算符 141
5.12 自測(cè)題 143
第6章 方法和類(lèi)詳解 145
6.1 控制對(duì)類(lèi)成員的訪問(wèn) 146
6.2 向方法傳遞對(duì)象 150
6.3 返回對(duì)象 153
6.4 方法重載 155
6.5 重載構(gòu)造函數(shù) 159
6.6 遞歸 163
6.7 理解static關(guān)鍵字 165
6.8 嵌套類(lèi)和內(nèi)部類(lèi) 170
6.9 varargs 173
6.9.1 varargs基礎(chǔ) 173
6.9.2 重載varargs方法 175
6.9.3 varargs和歧義 177
6.10 自測(cè)題 178
第7章 繼承 179
7.1 繼承的基礎(chǔ)知識(shí) 180
7.2 成員訪問(wèn)與繼承 182
7.3 構(gòu)造函數(shù)和繼承 184
7.4 使用super調(diào)用超類(lèi)構(gòu)造函數(shù) 186
7.5 使用super訪問(wèn)超類(lèi)成員 189
7.6 創(chuàng)建多級(jí)層次結(jié)構(gòu) 192
7.7 何時(shí)調(diào)用構(gòu)造函數(shù) 195
7.8 超類(lèi)引用和子類(lèi)對(duì)象 196
7.9 方法重寫(xiě) 200
7.10 重寫(xiě)的方法支持多態(tài)性 202
7.11 為何使用重寫(xiě)方法 203
7.12 使用抽象類(lèi) 207
7.13 使用final 210
7.13.1 使用final防止重寫(xiě) 210
7.13.2 使用final防止繼承 210
7.13.3 對(duì)數(shù)據(jù)成員使用final 211
7.14 Object類(lèi) 212
7.15 自測(cè)題 213
第8章 包和接口 215
8.1 包 216
8.1.1 定義包 216
8.1.2 尋找包和CLASSPATH 217
8.1.3 一個(gè)簡(jiǎn)短的包示例 217
8.2 包和成員訪問(wèn) 218
8.3 理解被保護(hù)的成員 220
8.4 導(dǎo)入包 222
8.5 Java的類(lèi)庫(kù)位于包中 223
8.6 接口 223
8.7 實(shí)現(xiàn)接口 224
8.8 使用接口引用 227
8.9 接口中的變量 233
8.10 接口能夠擴(kuò)展 234
8.11 默認(rèn)接口方法 235
8.11.1 默認(rèn)方法的基礎(chǔ)知識(shí) 235
8.11.2 默認(rèn)方法的實(shí)際應(yīng)用 236
8.11.3 多繼承問(wèn)題 237
8.12 在接口中使用靜態(tài)方法 238
8.13 私有接口方法 239
8.14 有關(guān)包和接口的最后思考 240
8.15 自測(cè)題 240
第9章 異常處理 241
9.1 異常的層次結(jié)構(gòu) 242
9.2 異常處理基礎(chǔ) 242
9.2.1 使用關(guān)鍵字try和catch 242
9.2.2 一個(gè)簡(jiǎn)單的異常示例 243
9.3 未捕獲異常的結(jié)果 245
9.4 使用多個(gè)catch語(yǔ)句 247
9.5 捕獲子類(lèi)異常 247
9.6 try代碼塊可以嵌套 248
9.7 拋出異常 249
9.8 Throwable詳解 251
9.9 使用finally 252
9.10 使用throws語(yǔ)句 254
9.11 另外3種異常功能 255
9.12 Java的內(nèi)置異常 256
9.13 創(chuàng)建異常子類(lèi) 258
9.14 自測(cè)題 262
第10章 使用I/O 265
10.1 基于流的Java I/O 266
10.2 字節(jié)流和字符流 266
10.3 字節(jié)流類(lèi) 266
10.4 字符流類(lèi) 267
10.5 預(yù)定義流 267
10.6 使用字節(jié)流 268
10.6.1 讀取控制臺(tái)輸入 269
10.6.2 寫(xiě)入控制臺(tái)輸出 269
10.7 使用字節(jié)流讀寫(xiě)文件 270
10.7.1 從文件輸入 270
10.7.2 寫(xiě)入文件 273
10.8 自動(dòng)關(guān)閉文件 275
10.9 讀寫(xiě)二進(jìn)制數(shù)據(jù) 277
10.10 隨機(jī)訪問(wèn)文件 281
10.11 使用Java字符流 283
10.11.1 使用字符流的控制臺(tái)輸入 284
10.11.2 使用字符流的控制臺(tái)輸出 286
10.12 使用字符流的文件I/O 287
10.12.1 使用FileWriter 287
10.12.2 使用FileReader 288
10.13 使用Java的類(lèi)型封裝器轉(zhuǎn)換數(shù)值字符串 289
10.14 自測(cè)題 296
第11章 多線程程序設(shè)計(jì) 299
11.1 多線程的基礎(chǔ)知識(shí) 300
11.2 Thread類(lèi)和Runnable接口 300
11.3 創(chuàng)建一個(gè)線程 301
11.4 創(chuàng)建多個(gè)線程 309
11.5 確定線程何時(shí)結(jié)束 311
11.6 線程的優(yōu)先級(jí) 314
11.7 同步 316
11.8 使用同步方法 317
11.9 同步語(yǔ)句 319
11.10 使用notify( )、wait( )和notifyAll( )的線程通信 321
11.11 線程的掛起、繼續(xù)執(zhí)行和停止 326
11.12 自測(cè)題 330
第12章 枚舉、自動(dòng)裝箱、靜態(tài)導(dǎo)入和注解 333
12.1 枚舉 334
12.2 Java語(yǔ)言中的枚舉是類(lèi)類(lèi)型 336
12.3 values( )和valueOf( )方法 336
12.4 構(gòu)造函數(shù)、方法、實(shí)例變量和枚舉 337
12.5 枚舉繼承enum 339
12.6 自動(dòng)裝箱 344
12.7 類(lèi)型封裝器 344
12.8 自動(dòng)裝箱的基礎(chǔ)知識(shí) 346
12.9 自動(dòng)裝箱和方法 347
12.10 發(fā)生在表達(dá)式中的自動(dòng)裝箱/自動(dòng)拆箱 348
12.11 靜態(tài)導(dǎo)入 349
12.12 注解(元數(shù)據(jù)) 352
12.13 自測(cè)題 354
第13章 泛型 355
13.1 泛型的基礎(chǔ)知識(shí) 356
13.2 簡(jiǎn)單的泛型示例 356
13.2.1 泛型只能用于引用類(lèi)型 359
13.2.2 泛型類(lèi)型是否相同基于其類(lèi)型實(shí)參 359
13.2.3 帶有兩個(gè)類(lèi)型形參的泛型類(lèi) 360
13.2.4 泛型類(lèi)的一般形式 361
13.3 受限類(lèi)型 361
13.4 使用通配符實(shí)參 364
13.5 受限通配符 366
13.6 泛型方法 369
13.7 泛型構(gòu)造函數(shù) 370
13.8 泛型接口 371
13.9 原類(lèi)型和遺留代碼 377
13.10 使用菱形運(yùn)算符進(jìn)行類(lèi)型推斷 379
13.11 局部變量類(lèi)型推斷和泛型 380
13.12 擦除特性 380
13.13 歧義錯(cuò)誤 380
13.14 一些泛型限制 381
13.14.1 類(lèi)型形參不能實(shí)例化 381
13.14.2 對(duì)靜態(tài)成員的限制 381
13.14.3 泛型數(shù)組限制 382
13.14.4 泛型異常限制 383
13.15 繼續(xù)學(xué)習(xí)泛型 383
13.16 自測(cè)題 383
第14章 lambda表達(dá)式和方法引用 385
14.1 lambda表達(dá)式簡(jiǎn)介 386
14.1.1 lambda表達(dá)式的基礎(chǔ)知識(shí) 386
14.1.2 函數(shù)式接口 387
14.1.3 幾個(gè)lambda表達(dá)式示例 389
14.2 塊lambda表達(dá)式 392
14.3 泛型函數(shù)式接口 393
14.4 lambda表達(dá)式和變量捕獲 398
14.5 從 lambda表達(dá)式中拋出異常 399
14.6 方法引用 401
14.6.1 靜態(tài)方法的方法引用 401
14.6.2 實(shí)例方法的方法引用 402
14.7 構(gòu)造函數(shù)引用 406
14.8 預(yù)定義的函數(shù)式接口 408
14.9 自測(cè)題 409
第15章 模塊 411
15.1 模塊基礎(chǔ) 412
15.1.1 簡(jiǎn)單的模塊示例 413
15.1.2 編譯、運(yùn)行第一個(gè)模塊示例 416
15.1.3 requires和exports 417
15.2 java.base和平臺(tái)模塊 417
15.3 舊代碼和未命名的模塊 418
15.4 導(dǎo)出到特定的模塊 419
15.5 使用requires transitive 420
15.6 使用服務(wù) 423
15.6.1 服務(wù)和服務(wù)提供程序的基礎(chǔ)知識(shí) 423
15.6.2 基于服務(wù)的關(guān)鍵字 424
15.6.3 基于模塊的服務(wù)示例 424
15.7 其他模塊功能 430
15.7.1 open模塊 430
15.7.2 opens語(yǔ)句 430
15.7.3 requires static 430
15.8 繼續(xù)模塊的學(xué)習(xí) 431
15.9 自測(cè)題 431
第16章 Swing介紹 433
16.1 Swing的起源和設(shè)計(jì)原則 434
16.2 組件和容器 435
16.2.1 組件 435
16.2.2 容器 436
16.2.3 頂級(jí)容器窗格 436
16.3 布局管理器 436
16.4 第一個(gè)簡(jiǎn)單的Swing程序 437
16.5 Swing事件處理 440
16.5.1 事件 441
16.5.2 事件源 441
16.5.3 事件監(jiān)聽(tīng)器 441
16.5.4 事件類(lèi)和監(jiān)聽(tīng)器接口 441
16.6 使用JButton 442
16.7 使用JTextField 445
16.8 使用JCheckBox 448
16.9 使用JList 450
16.10 使用匿名內(nèi)部類(lèi)或lambda表達(dá)式來(lái)處理事件 458
16.11 自測(cè)題 459
附錄A 自測(cè)題答案 461
附錄B 使用Java的文檔注釋 495
附錄C 編譯運(yùn)行簡(jiǎn)單的單文件程序 503
附錄D JShell簡(jiǎn)介 505
附錄E 更多Java關(guān)鍵字 513