內容簡介
本書是《瘋狂Java講義》的精粹版,本書同樣保留了《瘋狂Java講義》的特性:本書基於Java 7完成,全面介紹了Java 7的新特性。
本書刪除了《瘋狂Java講義》中關於圖形界面編程、資料庫編程的內容,保留了Java的基本語法結構、Java的面向對象特徵、Java集合框架體系、Java泛型、異常處理、Java注釋、Java的IO流體系、Java多執行緒編程、Java網路通信編程和Java反射機制的內容。本書的這種調整一方面是為了對《瘋狂Java講義》進行精簡,另一方面也是應廣大高校老師的反饋:高校課程前期已經講授過資料庫相關內容,因此本書刪除了相關內容。本書的寫作是基於Java 7完成的,全面介紹了Java 7的二進制整數、菱形語法、增強switch語句、多異常捕獲、自動關閉資源的try語句、JDBC 4.1新特性、NIO.2、AIO等新特性。
本書光碟里包含書中所有示例的代碼和《瘋狂Java實戰演義》的所有項目代碼。但由於本書並未包含Java圖形界面編程的相關知識,因此讀者在閱讀帶圖形界面的項目代碼時可能有一定困難,此時讀者可以參考《瘋狂Java講義》的相關內容,也可以登錄站點與筆者及本書龐大的讀者群相互交流。
本書為所有打算深入掌握Java編程的讀者而編寫,適合各種層次的Java學習者和工作者閱讀。本書專門針對高校課程進行過調整,尤其適合作為大學教育、培訓機構的Java教材。本書不適合只想簡單涉獵Java的讀者閱讀。
作者簡介
李剛,從事10多年的Java EE套用開發,現任瘋狂軟體教育中心教學總監。
瘋狂Java實訓營創始人,瘋狂Java體系圖書作者。曾任LITEON公司的J2EE技術主管,負責該公司的企業信息化平台的架構設計。
曾任廣州電信、廣東龍泉科技等公司的技術培訓導師。曾兼任廣東技術師範學院計算機科學系的兼職副教授。
2007年3月26日的《電腦報》專訪人物。
培訓的學生已在華為、立信、普信、網易、電信盈科等公司就職。
國內著名的高端IT技術作家,已出版《瘋狂Java講義》、《瘋狂Android講義》、《輕量級Java EE企業套用實戰》、《瘋狂Ajax講義》、《瘋狂XML講義》、《經典Java EE企業套用實戰》、《Struts 2.1權威指南》、《Ruby On Rails敏捷開發最佳實踐》等著作。其中瘋狂Java體系圖書都是已經得到廣泛的市場認同,並多次重印的暢銷圖書,並被多家高校選作教材,部分圖書已被翻譯成繁體中文版、輸出到台灣地區。
序
如何學習Java
——謹以此文獻給打算以編程為職業、並願意為之瘋狂的人
經常看到有些學生、求職者捧著一本類似JBuilder入門、Eclipse指南之類的圖書學習Java,當他們學會了在這些工具中拖出窗體、安裝按鈕之後,就覺得自己掌握、甚至精通了Java;又或是找來一本類似JSP動態網站編程之類的圖書,學會使用JSP腳本編寫一些頁面後,就自我感覺掌握了Java開發。
還有一些學生、求職者聽說J2EE、Spring或EJB很有前途,於是立即跑到書店或圖書館找來一本相關圖書。希望立即學會它們,然後進入軟體開發業、大顯身手。
還有一些學生、求職者非常希望找到一本既速成、又大而全的圖書,比如突擊J2EE開發、一本書精通J2EE之類的圖書(包括筆者曾出版的《輕量級J2EE企業套用實戰》一書,據說銷量不錯),希望這樣一本圖書就可以打通自己的“任督二脈”,一躍成為J2EE開發高手。
也有些學生、求職者非常喜歡J2EE項目實戰、項目大全之類的圖書,他們的想法很單純:我按照書上介紹,按圖索驥、依葫蘆畫瓢,應該很快就可學會J2EE,很快就能成為一個受人羨慕的J2EE程式設計師了。
……
凡此種種,不一而足。但最後的結果往往是失敗,因為這種學習沒有積累、沒有根基,學習過程中困難重重,每天都被一些相同、類似的問題所困擾,起初熱情十足,經常上論壇詢問,按別人的說法解決問題之後很高興,既不知道為什麼錯?也不知道為什麼對?只是盲目地抄襲別人的說法。最後的結果有兩種:
久而久之,熱情喪失,最後放棄學習。
大部分常見問題都問遍了,最後也可以從事一些重複性開發,但一旦遇到新問題,又將束手無策。
第二種情形在普通程式設計師中占了極大的比例,筆者多次聽到、看到(在網路上)有些程式設計師抱怨:我做了2年多Java程式設計師了,工資還是3000多點。偶爾筆者會與他們聊聊工作相關內容,他們會告訴筆者:我也用Spring了啊,我也用EJB了啊……他們感到非常不平衡,為什麼我的工資這么低?其實筆者很想告訴他們:你們太浮躁了!你們確實是用了Spring、Hibernate又或是EJB,但你們未想過為什麼要用這些技術?用這些技術有什麼好處?如果不用這些技術行不行?
很多時候,我們的程式設計師把Java當成一種腳本,而不是一門面向對象的語言。他們習慣了在JSP腳本中使用Java,但從不去想JSP如何運行,Web伺服器里的網路通信、多線層機制,為何一個JSP頁面能同時向多個請求者提供服務?更不會想如何開發Web伺服器;他們像代碼機器一樣編寫SpringBean代碼,但從不去理解Spring容器的作用,更不會想如何開發Spring容器。
有時候,筆者的學生在編寫五子棋、梭哈等作業感到困難時,會向他們的大學師兄、朋友求救,這些程式設計師告訴他:不用寫了,網上有下載的!聽到這樣回答,筆者不禁感到啞然:網上還有Windows下載呢!網上下載和自己編寫是兩碼事。偶爾,筆者會懷念以前黑色螢幕、綠熒熒字元時代,那時候程式設計師很單純:當我們想偷懶時,習慣思維是寫一個小工具;現在程式設計師很聰明:當他們想偷懶時,習慣思維是從網上下一個小工具。但是,誰更幸福?
當筆者的學生把他們完成的小作業放上網際網路之後,然後就有許多人稱他們為“高手”!這個稱呼卻讓他們萬分慚愧;慚愧之餘,他們也感到萬分欣喜,非常有成就感,這就是編程的快樂。編程的過程,與尋寶的過程完全一樣:歷經辛苦,終於找到心中的夢想,這是何等的快樂?
如果真的打算將編程當成職業,那就不應該如此浮躁,而是應該扎紮實實先學好Java語言,然後按Java本身的學習規律,踏踏實實一步一個腳印地學習,把基本功練紮實了才可獲得更大的成功。
實際情況是,有多少程式設計師真正掌握了Java的面向對象?真正掌握了Java的多執行緒、網路通信、反射等內容?有多少Java程式設計師真正理解了類初始化時記憶體運行過程?又有多少程式設計師理解Java對象從創建到消失的全部細節?有幾個程式設計師真正獨立地編寫過五子棋、梭哈、桌面彈球這種小遊戲?又有幾個Java程式設計師敢說:我可以開發Struts?我可以開發Spring?我可以開發Tomcat?很多人又會說:這些都是許多人開發出來的!實際情況是:許多開源框架的核心最初完全是由一個人開發的。現在這些優秀程式已經出來了!你,是否深入研究過它們,是否深入掌握了它們?
如果要真正掌握Java,包括後期的JavaEE相關技術(例如Struts、Spring、Hibernate和EJB等),一定要記住筆者的話:絕不要從IDE(如JBuilder、Eclipse和NetBeans)工具開始學習!IDE工具的功能很強大,初學者學起來也很容易上手,但也非常危險:因為IDE工具已經為我們做了許多事情,而軟體開發者要全部了解軟體開發的全部步驟。
2011年12月17日
前 言
2011年7月,Oracle如約發布了Java 7正式版。接下來筆者對《瘋狂Java講義》進行了升級:使用Java 7改寫了全書所有程式,全面介紹了Java 7的各種新特性。
《瘋狂Java講義》面市的近3年時間內,得到了廣大讀者的一致好評。筆者也收到了一些關於《瘋狂Java講義》的建議:有人覺得這本書實在太大、太厚了;也有讀者建議把《瘋狂Java講義》拆分成上、下冊來出版;針對這些建議,筆者慎重地斟酌了很久:Java經過10多年的發展,已經成為世界上套用最廣泛的程式語言,而且Java語言的強大是有目共睹的。功能如此豐富、強大,歷史如此悠久的一門程式語言,如果希望通過一本三、四百頁的書能講透,筆者覺得不太現實。雖然筆者也很希望對《瘋狂Java講義》進行精簡,但實在難以取捨。如果把《瘋狂Java講義》拆分成上、下冊來出版,這種做法會增加讀者的經濟負擔(1本書變成了2本書,總價會高很多)。後來出版社的朋友啟發說:可以嘗試把《瘋狂Java講義》部分內容抽取成“精粹本”;又想到有高校老師反應:學校在安排Java課程之前,已經安排了資料庫開發相關課程,《瘋狂Java講義》中關於SQL、JDBC編程的內容有些重複。出於上面兩種需求,筆者對《瘋狂Java講義》內容進行了調整,刪除了部分內容,得到這本《瘋狂Java講義精粹》,本書更適合作為高校教材使用。
在以“瘋狂Java體系”圖書為教材的瘋狂軟體教育中心裡,經常有學生詢問:為什麼叫瘋狂Java這個名字?也有一些讀者通過網路、郵件來詢問這個問題。其實這個問題答案可以在本書第1版的前言中找到。瘋狂的本質是一種“享受編程”的狀態。在一些不了解編程的人看來:編程的人總面對著電腦、在鍵盤上敲打,這種生活實在太枯燥了,但實際上是因為他們並未真正了解編程,並未真正走進編程。在外人眼中:程式設計師不過是在敲打鍵盤;但在程式設計師心中:程式設計師敲出的每個字元,都是程式的一部分。
程式是什麼呢?程式是對現實世界的數位化模擬。開發一個程式,實際是創造一個或大或小的“模擬世界”。在這個過程中,程式設計師享受著“創造”的樂趣,程式設計師沉醉在他所創造“模擬世界”里:瘋狂地設計、瘋狂地編碼實現。實現過程不斷地遇到問題,然後解決它;不斷地發現程式的缺陷,然後重新設計、修復它——這個過程本身就是一種享受。一旦完全沉浸到編程世界裡,程式設計師是“物我兩忘”的,眼中看到的、心中想到的,只有他正在創造的“模擬世界”。
在學會享受編程之前,編程學習者都應該採用“案例驅動”的方式,學習者需要明白程式的作用是:解決問題——如果你的程式不能解決你自己的問題,如何期望你的程式去解決別人的問題呢?那你的程式的價值何在?——知道一個知識點能解決什麼問題,才去學這個知識點,而不是盲目學習!因此本書強調編程實戰,強調以項目激發編程興趣。
僅僅只是看完這本書,你不會成為高手!在編程領域裡,沒有所謂的“武林秘笈”,再好的書一定要配合大量練習,否則書里的知識依然屬於作者,而讀者則仿佛身入寶山而一無所獲的笨漢。本書配合了大量高強度的練習,希望讀者強迫自己去完成這些項目。這些習題的答案可以參考本書所附光碟中《瘋狂Java實戰演義》的配套代碼。如果需要獲得編程思路和交流,可以登錄與廣大讀者和筆者交流。
本書有什麼特點
本書是《瘋狂Java講義》的精粹版,本書並不是一本簡單的Java入門教材。本書的內容完全取自《瘋狂Java講義》,只是刪減了原書中關於SQL、JDBC編程,以及Java圖形界面編程的相關內容。
因此,本書具有如下三個特點。
1.闡述透徹、原理清晰
本書並不是簡單地羅列Java語法規則,而是儘量從語法設計者的角度向讀者解釋每個語法規則的作用、緣由;本書力求從運行機制來解釋代碼的運行過程,從記憶體分配的細節上剖析程式的運行細節。閱讀本書不僅要求讀者知道怎么做,而且要求讀者能理解“為什麼這么做”。
2.再現李剛老師課堂氛圍
本書的內容是筆者6年多授課經歷的總結,知識體系取自瘋狂Java實戰的課程體系。
本書力求再現筆者的課堂氛圍:以淺顯比喻代替乏味的講解,以瘋狂實戰代替空洞的理論。
書中包含了大量“注意”、“學生提問”部分,這些正是上千個Java學員所犯錯誤的匯總。
3.注釋詳細,輕鬆上手
為了降低讀者閱讀的難度,書中代碼的注釋非常詳細,幾乎每兩行代碼就有一行注釋。不僅如此,本書甚至還把一些簡單理論作為注釋穿插到代碼中,力求讓讀者能輕鬆上手。
本書所有程式中關鍵代碼以粗體字標出,也是為了幫助讀者能迅速找到這些程式的關鍵點。
本書寫給誰看
如果你僅僅想對Java有所涉獵,那么本書並不適合你;如果你想全面掌握Java語言,並使用Java來解決問題、開發項目,或者希望以Java編程作為你的職業,那么本書將非常適合你。希望本書能引爆你內心潛在的編程激情,如果本書能讓你產生廢寢忘食的感覺,那筆者就非常欣慰了。
李剛
2011-12-17
目 錄
第1章 Java語言概述
1.1 Java語言的發展簡史
1.2 Java的競爭對手及各自優勢
1.2.1 C#簡介和優勢
1.2.2 Ruby簡介和優勢
1.2.3 Python簡介和優勢
1.3 Java程式運行機制
1.3.1 高級語言的運行機制
1.3.2 Java程式的運行機制和JVM
1.4 開發Java的準備
1.4.1 下載和安裝Java 7的JDK
學生提問 不是說JVM是運行Java程式的虛擬機嗎?那JRE和JVM的關係是怎樣的呢?
為什麼不安裝公共JRE呢?
1.4.2 設定PATH環境變數
學生提問 為什麼選擇用戶變數?用戶變數與系統變數有什麼區別?
1.5 第一個Java程式
1.5.1 編輯Java原始碼
1.5.2 編譯Java程式
學生提問 當我們編譯C程式時,不僅需要指定存放目標檔案的位置,也需要指定目標檔案的檔案名稱,這裡使用javac編譯Java程式時怎么不需要指定目標檔案的檔案名稱呢?
1.5.3 運行Java程式
1.5.4 根據CLASSPATH環境變數定位類
1.6 Java程式的基本規則
1.6.1 Java程式的組織形式
1.6.2 Java源檔案的命名規則
1.6.3 初學者容易犯的錯誤
1.7 垃圾回收機制
1.8 何時開始使用IDE工具
學生提問 我想學習Java編程,到底是學習Eclipse好呢,還是學習NetBeans好呢?
1.9 本章小結
本章練習
第2章 數據類型和運算符
2.1 注釋
2.1.1 單行注釋和多行注釋
2.1.2 文檔注釋
API文檔是什麼?
學生提問 為什麼要掌握查看API文檔的方法?
2.2 標識符和關鍵字
2.2.1 分隔設定
2.2.2 標識符規則
2.2.3 Java關鍵字
2.3 數據類型分類
2.4 基本數據類型
2.4.1 整型
2.4.2 Java 7新增的二進制整數
2.4.3 字元型
2.4.4 浮點型
2.4.5 Java 7新增的數值中使用下畫線分隔
2.4.6 布爾型
2.5 基本類型的類型轉換
2.5.1 自動類型轉換
2.5.2 強制類型轉換
2.5.3 表達式類型的自動提升
2.6 直接量
2.6.1 直接量的類型
2.6.2 直接量的賦值
2.7 運算符
2.7.1 算術運算符
2.7.2 賦值運算符
2.7.3 位運算符
2.7.4 擴展後的賦值運算符
2.7.5 比較運算符
2.7.6 邏輯運算符
2.7.7 三目運算符
2.7.8 運算符的結合性和優先權
2.8 本章小結
本章練習
第3章 流程控制與數組
3.1 順序結構
3.2 分支結構
3.2.1 if條件語句
3.2.2 Java 7的switch分支語句
3.3 循環結構
3.3.1 while循環語句
3.3.2 do while循環語句
3.3.3 for循環
3.3.4 嵌套循環
3.4 控制循環結構
3.4.1 使用break結束循環
3.4.2 使用continue結束本次循環
3.4.3 使用return結束方法
3.5 數組類型
3.5.1 理解數組:數組也是一種類型
int[]是一種類型嗎?怎么使用這種類型呢?
3.5.2 定義數組
3.5.3 數組的初始化
學生提問 能不能只分配記憶體空間,不賦初始值呢?
3.5.4 使用數組
學生提問 為什麼要我記住這些異常信息?
3.5.5 foreach循環
3.6 深入數組
3.6.1 記憶體中的數組
學生提問 為什麼有棧記憶體和堆記憶體之分?
3.6.2 基本類型數組的初始化
3.6.3 引用類型數組的初始化
3.6.4 沒有多維數組
學生提問 我是否可以讓圖3.13中灰色覆蓋的數組元素再次指向另一個數組?這樣不就可以擴展成三維數組嗎?甚至擴展成更多維的數組?
3.6.5 運算元組的工具類
3.6.6 數組的套用舉例
3.7 本章小結
本章練習
第4章 面向對象(上)
4.1 類和對象
4.1.1 定義類
學生提問 構造器不是沒有返回值嗎?為什麼不能用void修飾呢?
4.1.2 對象的產生和使用
4.1.3 對象、引用和指針
4.1.4 對象的this引用
4.2 方法詳解
4.2.1 方法的所屬性
4.2.2 方法的參數傳遞機制
4.2.3 形參個數可變的方法
4.2.4 遞歸方法
4.2.5 方法重載
學生提問 為什麼方法的返回值類型不能用於區分重載的方法?
4.3 成員變數和局部變數
4.3.1 成員變數和局部變數
4.3.2 成員變數的初始化和記憶體中的運行機制
4.3.3 局部變數的初始化和記憶體中的運行機制
4.3.4 變數的使用規則
……
第5章 面向對象(下)
第6章 Java集合
第7章 泛型
第8章 異常處理
第9章 Annotation(注釋)
第10章 輸入/輸出
第11章 多執行緒
第12章 網路編程
第13章 類載入機制與反射