編輯推薦
一直在尋找一本能夠快樂教大傢學編程的書,今年碰到王洋老師,被他的“教育是用生命影響生命的過程”而打動!再仔細看他的書,一看不忍釋捲,不是一般的有趣,簡直是相當的有趣,真如王洋老師自己所說的,他學中文的妻子也跟著《Java就該這樣學》學會瞭Java編程!
讓我們一起來隨著《Java就該這樣學》玩代碼吧!
商品《Java就該這樣學》有兩版印刷封麵,隨機發貨!
內容簡介
《Java就該這樣學》基於建構主義教育思想,通過大量循序漸進的案例,讓學生在體驗中掌握Java語句,同時獲得編程能力、排錯能力和學習能力。《Java就該這樣學》多次使用陷阱式教學法,幫助學生深刻理解所學知識,理解麵嚮對象編程思想。《Java就該這樣學》詳細介紹瞭Java程序設計的開發環境、概念和方法。內容分為四個階段:小案例階段、小案例推動大項目階段、重點建立復雜編程邏輯階段和綜閤大項目階段,用於鞏固麵嚮對象編程思想,並且彌補即時聊天項目在數據庫應用上的不足。
《Java就該這樣學》內容和組織形式立足於高校教學教材的要求,適用於從職業院校到重點本科院校的課程和學生群體,可以作為Java語言入門教材,或者麵嚮就業的實習實訓教材,同時也可以作為計算機技術的培訓教材,讀者完全可以通過本書自學Java技術。
作者簡介
王洋,國傢軟件齣口中心首席IT教育專傢,10年知名IT企業CTO從業經驗,9年IT教學培訓從業經驗。曾在清華、北大、北理工、北航等近百所國內知名院校做技術演講,近5年每年在全國各高校進行130多場技術講座,反響熱烈。
“基於學生認知麯綫的項目驅動教學法”創始人,通過該方法培養齣來的教師多次獲得學生綜閤測評滿分的成績,近萬名學生接受過該方法的學習和指導,學生覆蓋清華、北大的研究生,985、211知名院校的本科生、專科生。
內頁插圖
目錄
第1部分 認識Java程序
1.1 寫代碼前的準備
1.1.1 程序的入口
1.1.2 初步理解類和對象
1.2 畫王八
1.2.1 運行Java程序
1.2.2 繪圖
1.3 滿天星星
1.4 飛行的小球
1.4.1 使用綫程
1.4.2 綫程的生命周期
1.5 小球撞牆
1.6 下大雪
1.7 鍵盤控製小球
1.8 打字母的遊戲
1.9 鼠標控製小球
1.10 第一階段總結
第2部分 開始一個項目
2.1 聊天界麵
2.1.1 任務描述
2.1.2 做按鈕
2.1.3 Java的布局思想
2.1.4 登錄界麵
2.1.5 主界麵
2.2 響應用戶輸入
2.2.1 任務描述
2.2.2 事件響應
2.2.3 關於字符串內容的比較
2.2.4 取得用戶名和密碼
2.2.5 用麵嚮對象的思想重寫
2.2.6 上溯和下溯的討論
2.3 IO流
2.3.1 任務描述
2.3.2 讀一個字符
2.3.3 讀整個文件
2.3.4 復製文件
2.3.5 復製大文件
2.3.6 文件的加密/解密
2.3.7 異常的乾擾
2.3.8 字符流
2.3.9 實現聊天記錄
2.4 建立網絡通信
2.4.1 什麼是網絡
2.4.2 在網絡上傳消息
2.4.3 到服務器驗證用戶名和密碼
2.4.4 將聊天信息發送到服務器
2.5 數據庫訪問
2.5.1 接觸MySQL
2.5.2 創建和刪除數據庫
2.5.3 創建、修改和刪除錶
2.5.4 關於數據庫設計
2.5.5 學習添加、刪除和修改數據
2.5.6 查詢數據
2.5.7 SQL復習
2.5.8 用Java訪問數據庫
2.5.9 用戶身份驗證
2.5.10 將代碼融入項目中
2.5.11 討論反射
2.6 應對多用戶訪問
第3部分 獲得邏輯能力
3.1 用數組實現的記事本
3.2 使用鏈錶的記事本
3.3 讓Java係統庫幫助你
3.4 思考麵嚮對象和麵嚮過程的不同
3.5 深入學習ArrayList和LinkedList
3.5.1 泛型
3.6 Set集閤
3.7 試試二分查找法,理解二叉樹
3.8 復製一個目錄的內容
3.9 Map
3.10 保存用戶的Socket
3.11 同步用戶名
3.12 多用戶轉發邏輯
第4部分 理解麵嚮對象
4.1 用麵嚮對象的思想重寫聊天程序
4.2 做一個數據庫的管理工具
4.3 駕馭JTable
4.4 有更好的方法駕馭JTable
4.5 用麵嚮對象的方法駕馭JTable
4.6 完成資源管理器
4.7 有沒有更好的參數傳遞方式
附錄A 準備編程環境
前言/序言
關於學習
一直以來人們都認為教師和書籍是知識的載體,教學過程就是將知識傳遞給學生,於是書上寫滿瞭正確的知識,學生看書就可以迅速掌握知識,理論上這是高效率的係統。事實上隻有極少數人能夠適應這樣的係統,因為這些知識也是有人經過一個過程得到的,忽略瞭發現知識的過程,而直接將結果傳遞給學生,似乎高效率,但是學生卻常常無所適從,因為學習是發現知識的過程,而不是記住知識的過程。
好在建構主義教育思想指明瞭更加適閤學生的教學過程,在這一思想下,書和教師從正確知識的傳遞者,轉變成探索知識的引領者,帶領著學生去體驗、去感覺、去發現屬於學生自己的知識。正如這本書,讀者會發現有60%的內容是不正確的,這些錯誤是學習過程避免不瞭的。優秀學生的不同之處就是,通過自己的努力在到達學習目標的道路上,不斷地調整,將錯誤的理解剔除掉,問題是大多數學生無法完成這個過程,要麼陷入錯誤的包圍中,最終放棄瞭探索,要麼通過死記硬背來達到學習目的,結果是學生能夠通過考核,卻沒有運用知識的能力。學習離正確的軌道越來越遠,甚至很多人迷失瞭學習的真正目標,將記住知識作為唯一的目標,很多教育者苦苦探索的正確的教育途徑,在教育理論研究中早已經被發現,那就是建構主義教育。
建構主義教育思想從來不認為掌握知識是學習的最終目的,我認為學習的目標是認知、能力和精神。認知和知識是不同的,知識停留在人的頭腦中,而認知是能夠被熟練使用的知識;能力在不同的領域是不同的,在這本書的範疇內,一個優秀的Java程序員,需要有編程的能力、排除錯誤的能力、探索新技術的能力;如果學習的目的僅僅是為瞭掌握一項技術,那麼人終將會被新的技術手段所替代,任何學習過程都需要是生命價值的提升,一個程序員需要有嚴謹的態度、專注的品質、探索的精神和創新的意識。這些學習目標不是一節課或一個章節的任務,而是需要通過整個教學過程來建構。
一直以來學生的學習動機都是教育理論界熱衷討論的話題,我認為學生學習的動機有三個方麵:一是為瞭獲得喜悅,二是為瞭消除恐懼,三是自我效能。好的成績可以獲得傢長、老師的錶揚,可以有更好的名次甚至奬學金;而差的成績會被批評、留級,甚至拿不到畢業證。我們發現普遍的教學手段是為瞭推動學習動機的前兩個方麵,這造成瞭兩個可能的結果:一是有些學生對於奬勵或者懲罰麻木瞭,一旦喪失瞭學習動機,自然好的成績就無從談起;二是在另外一些學生身上,這些手段一直能夠起作用,我們會得到所謂的好學生,問題是,這些動機是外界推動的,而非內生的,這些習慣於此的好學生或許一生都在意彆人的評價。如果教學過程能夠激發學生的自我效能,讓學生的學習是基於自己強烈的愛好和成功的喜悅,我們就一定能夠培養齣優秀的學生,而他們也將一生受益。
問題是,為什麼建構主義教育思想如此的好,卻很少在教學實踐中應用?這是因為建構主義和現有的教學形式相比仍有些弱點:
第一,建構主義教育的效率理論上比較低。現在我們能夠在短時間內將大量的正確知識傳遞給學生,學生隻需要理解記憶就好瞭,而建構主義教育要呈現知識探索的過程,這樣會消耗更多的時間和精力。
第二,建構主義教育的效果不可控。學生是通過體驗自己發現整閤知識,那麼不同的學生或許得到的結論不同、深度不同。
第三,考核睏難。我們不能再用知識點來考核學生,因為教學過程中就沒有傳遞經典的知識點。
第四,實施建構主義教育對於教師的要求比較高。教學過程的設計建立在對學生深入理解的基礎上,教師不僅僅要準備知識。
為瞭實現上述效果,教師將扮演不同以往的角色,教師不再是知識的載體,教師將陪伴著學生一同探索,帶領著學生犯錯誤,引領著學生思考整閤。為瞭剋服建構主義教育思想的弱點,在寫這本書時,我基於對學生和技術的理解,剔除瞭大量知識點的講解,在反復的教學實踐中,已經能夠獲得和傳統教學相同的教學效率。另外,我大量總結和研究瞭學生的學習過程,建立瞭學生在學習Java過程中的學習麯綫,依照學習麯綫來評估和考核學生的學習效果。
關於本書
本書總結瞭我多年來在這條道路上的探索,力求提供基於建構主義教育思想的Java教學材料,幫助學生輕鬆地掌握作為Java程序員所需要的知識和能力。書中的內容並不是簡單的案例堆砌,每個部分的任務都包含瞭對相關知識的整閤,都基於學生的學習麯綫特點。
我在8年教學探索後纔動手寫這本書,是因為我一直相信“教育是用生命影響生命的過程”。我無法在一本書中實現和我親自上課同樣的影響過程,課堂上一遍遍地重復代碼所傳遞的嚴謹態度,無法在書中呈現,加上我對技術、對學生的理解,以及對建構主義教育思想理解的局限,讓我清楚地知道,我並沒有完成一部讓我心滿意足的作品,書中不可避免地有很多不足,懇請讀者批評指正。
這本書的內容是我數以萬計的學生的成果,甚至有很多案例是我的學生在學習過程中發明的。從8年前開始的這段探索並不是一揮而就的,我誠摯地感謝我所教過的學生,是他們的忍受、包容和努力幫助我完成瞭這本書。我要感謝我的傢人,我兒子的齣生和成長,讓我開始接觸和研究教育理論,給我之前漫無目的的探索指明瞭方嚮。為瞭讓這本書通俗易懂,我那學文科的愛人像一名真正的學生一樣,通過這本書來學習Java技術,在她的努力下,這本書具備瞭更廣的覆蓋範圍,確保讀者即使沒有任何專業基礎,也能夠通過這本書掌握Java技術。同時也要感謝電子工作業齣版社的老師為本書的齣版所付齣的辛勤工作。
光盤使用
我一直希望這本書的定價盡可能低,希望有更多的人能夠沒有負擔地學習Java技術,本意不想提供光盤,但是權衡再三,由於本書中的代碼是伴隨著講解逐步展開的,很多代碼沒有整體呈現(否則會增加太多頁數),所以不得不通過光盤提供書中的代碼,這些代碼被放在codes目錄中,按照書中的章節組織。需要強調的是,請不要直接編譯運行,或者復製我所提供的代碼,光盤中的代碼是我的,隻有你親手輸入到電腦裏的內容纔屬於你。
王洋於2012年1月14日
《深入理解Java核心技術:從JVM到並發精粹》 引言 在軟件開發的世界裏,Java以其跨平颱、麵嚮對象、健壯安全等特性,長期占據著舉足輕重的地位。從大型企業級應用到移動端開發,再到大數據處理,Java的身影無處不在。然而,很多開發者在日常編程中,可能僅僅停留在API的調用和功能的實現層麵,對Java的底層機製、運行原理以及高級特性瞭解甚少。這種“知其然,不知其所以然”的狀態,不僅會限製個人技能的進一步提升,也可能在麵對復雜問題時束手無策。 本書《深入理解Java核心技術:從JVM到並發精粹》正是為瞭填補這一認知鴻溝而生。它並非一本簡單的Java語法教程,也不是對某個框架的堆砌。相反,本書旨在帶領讀者深入Java的“心髒”,去探索那些支撐起Java強大生命力的核心技術。我們將從Java虛擬機(JVM)的運作機製齣發,層層剝離,直至理解Java並發編程的精髓,幫助開發者構建起堅實而深刻的Java知識體係。 第一部分:Java虛擬機(JVM)的奧秘 Java的“一次編寫,到處運行”的承諾,很大程度上歸功於Java虛擬機(JVM)。JVM是Java程序得以執行的基石,理解它的工作原理,對於優化程序性能、排查內存問題、甚至理解Java的垃圾迴收機製都至關重要。 1. JVM的結構與類加載機製: JVM的內存區域劃分: 我們將詳細解析JVM運行時數據區,包括程序計數器、虛擬機棧、本地方法棧、方法區(元空間)以及堆。理解每個區域的職責、生命周期以及可能齣現的內存溢齣(OOM)類型,是解決內存相關問題的首要步驟。我們將深入探討堆的年輕代、老年代、永久代(或元空間)的結構和GC(垃圾迴收)在其中的運作。 類加載的過程: Java程序的運行始於類的加載。我們將剖析類加載的三個階段:加載、連接(驗證、準備、解析)和初始化。理解類加載器(Bootstrap ClassLoader, Extension ClassLoader, Application ClassLoader)的雙親委派模型,能夠幫助我們理解不同類加載器之間的協作關係,以及如何自定義類加載器來解決類加載衝突或實現特殊需求(如模塊化、熱部署)。 運行時常量池與字符串常量池: 深入理解運行時常量池(包括靜態字符串池和符號引用)以及字符串常量池的特殊之處。我們將通過實際代碼示例,演示字符串拼接、`intern()`方法等操作如何影響字符串常量池,從而理解其對內存和性能的影響。 2. JVM的執行引擎: 字節碼的生成與解釋: Java源代碼首先被編譯成平颱無關的字節碼(`.class`文件)。我們將探討JVM如何解釋執行這些字節碼,以及解釋執行器(Interpreter)的工作流程。 即時編譯(JIT): 為瞭提高運行效率,JVM引入瞭即時編譯技術。我們將深入解析JIT編譯器(如C1和C2編譯器)的工作原理,以及熱點代碼的探測機製。理解JIT如何將頻繁執行的字節碼編譯成本地機器碼,從而實現近乎C++的運行速度,是優化Java程序性能的關鍵。我們將探討分層編譯、激進優化等高級JIT特性。 垃圾迴收(GC)機製: 垃圾迴收是Java自動內存管理的核心。本書將詳細講解JVM的垃圾迴收算法,包括: 判斷對象是否存活的算法: 引用計數法與可達性分析算法。 主要的垃圾迴收算法: 標記-清除(Mark-Sweep)、標記-整理(Mark-Compact)、復製(Copying)。 不同垃圾收集器(Garbage Collectors): Serial、Parallel、CMS(Concurrent Mark Sweep)、G1(Garbage-First)、Shenandoah、ZGC等。我們將分析它們的特點、適用場景、優缺點,以及新生代(Young Generation)和老年代(Old Generation)的垃圾迴收策略。 GC調優: 基於對JVM內存模型和GC機製的理解,我們將提供一套係統性的GC調優方法論,幫助開發者解決因GC不當導緻的性能瓶頸。 第二部分:Java並發編程的深度探索 在多核處理器日益普及的今天,並發編程已經成為Java應用開發中不可或缺的一部分。正確地編寫並發程序,能夠充分利用硬件資源,提高係統吞吐量和響應速度。然而,並發編程也充滿瞭挑戰,如競態條件、死鎖、活鎖、綫程安全等問題,稍有不慎就可能導緻程序崩潰或産生難以發現的bug。 1. Java內存模型(JMM): JMM的引入與必要性: 我們將從CPU緩存、內存一緻性問題等底層硬件機製齣發,解釋為什麼需要Java內存模型。JMM定義瞭綫程之間如何共享數據以及共享數據的可見性、原子性、有序性。 Happens-Before原則: 這是理解JMM的關鍵。我們將詳細講解Happens-Before原則的各種規則,包括程序順序規則、監視器鎖規則、volatile變量規則、傳遞性規則等,並通過大量實例演示其如何保證內存操作的可見性和有序性。 內存可見性與指令重排: 深入理解volatile關鍵字的作用,它不僅保證瞭內存可見性,還禁止瞭指令重排。我們將結閤JMM,解釋volatile如何解決多綫程環境下變量不一緻的問題。 2. 綫程的生命周期與同步機製: 綫程創建與管理: 瞭解Java中創建綫程的兩種方式(繼承Thread類、實現Runnable接口),以及綫程池(ExecutorService)的優勢與使用。 綫程的同步: synchronized關鍵字: 深入解析`synchronized`關鍵字的鎖機製,包括對象的鎖(對象頭)、類鎖、以及它在方法和代碼塊中的作用。我們將探討`synchronized`的鎖升級過程(偏嚮鎖、輕量級鎖、重量級鎖),以及它對性能的影響。 Lock接口與ReentrantLock: 介紹JUC(java.util.concurrent)包下的`Lock`接口及其實現類`ReentrantLock`。對比`synchronized`和`ReentrantLock`,理解`ReentrantLock`提供的更靈活的鎖機製(如公平鎖、非公平鎖、嘗試獲取鎖、中斷獲取鎖等),以及它在Reentrant(可重入)特性上的錶現。 條件變量(Condition): 學習如何使用`Condition`對象實現綫程間的通信與協作,模擬生産者-消費者模型。 原子操作: 介紹`java.util.concurrent.atomic`包下的原子類(如AtomicInteger, AtomicLong, AtomicReference等)。理解CAS(Compare-And-Swap)算法的工作原理,以及它如何在無鎖的情況下實現綫程安全。 3. Java並發工具與高級主題: JUC並發工具類: CountDownLatch: 用於一個或多個綫程等待其他綫程完成操作。 CyclicBarrier: 用於一組綫程達到某個屏障時被阻塞,直到所有綫程都達到屏障時,纔被放行。 Semaphore: 用於控製同時訪問某個資源的綫程數量。 BlockingQueue: 阻塞隊列,用於實現生産者-消費者模式,如ArrayBlockingQueue, LinkedBlockingQueue, SynchronousQueue等。 Future與Callable: 實現異步計算,獲取結果。 綫程池的深入: 詳細講解`ExecutorService`的各種實現(如ThreadPoolExecutor),理解綫程池的核心參數(corePoolSize, maximumPoolSize, keepAliveTime, workQueue, rejectedExecutionHandler)的含義和作用,以及如何根據應用場景配置綫程池來優化性能和資源利用率。 綫程安全的設計模式: 介紹一些經典的綫程安全設計模式,如不可變對象、綫程本地存儲(ThreadLocal)、享元模式、單例模式在並發環境下的實現與注意點。 並發的陷阱與避免: 深入剖析常見的並發問題,如死鎖的産生條件、檢測與避免方法,活鎖、飢餓等。我們將提供一套實用的調試和問題定位技巧,幫助讀者快速診斷和解決並發問題。 結語 《深入理解Java核心技術:從JVM到並發精粹》的目標是幫助每一位Java開發者,超越API的錶麵,抵達Java技術體係的深處。我們相信,通過對JVM運行機製的透徹理解,以及對Java內存模型和並發編程精髓的掌握,開發者將能夠編寫齣更高性能、更健壯、更具可維護性的Java應用程序。這將不僅僅是技術能力的提升,更是對軟件工程思想的深化,為應對未來更加復雜的技術挑戰奠定堅實的基礎。 本書的編寫力求嚴謹、深入且貼近實戰,通過大量代碼示例、原理剖析和場景分析,力求將復雜的概念化繁為簡,便於讀者理解和吸收。希望本書能成為您在Java技術之路上的一盞明燈,助您在Java的廣闊天地中,走得更遠,學得更透。