《Java程式設計與資料結構教程(第二版)》學習指導
目錄
- 圖書簡況
- 學習指導
- 第一章 緒論
- 第二章 資料和表達式
- 第三章 使用類和對象
- 第四章 條件和循環
- 第五章 編寫類
- 第六章 圖形使用者界面
- 第七章 數組
- 第八章 繼承
- 第九章 多态
- 第十章 異常
- 第十一章 遞歸
- 第十二章 算法分析
- 第十三章 查找與排序
- 第十四章 棧
- 第十五章 隊列
- 第十六章 樹
- 第十七章 二叉排序樹
- 第十八章 堆和優先隊列
- 第十九章 圖
- 第二十章 雜湊演算法
- 第二十一章 資料庫
- 補充:Java I/O
- 補充:Java 多線程
- 補充:Java網絡程式設計
- 補充:Java安全
- 補充:Android開發
Java程式設計與資料結構教程(第二版) (Java Foundations,官網)是我們《程式設計與資料結構》 課程的教材。本書頗具匠心地将程式設計、資料結構等相關課程内容有機地包含在一本書中,解決了這兩門專業基礎課不能很好地銜接的問題。本書将重點放在軟體開發實踐方面,使用資料結構的内容作為問題導引,在介紹經典算法的同時還介紹了如何用所學知識來解決實際問題。
需要說明的是本書英文版已經出了第三版,希望大家能參考學習。
這本書的内容來自作者John Lewis的另外兩本書: Java程式設計教程(Java Software Solutions,官網)和Java軟體結構與資料結構(Java Software Structures,官網)。這兩本書在學習也是重要的學習參考。
考慮到大家沒有上過《計算機導論》課程,推薦John Lewis參與編寫的一本計算機科學概論(Computer Science Illuminated)作為學習參考,這本書用洋蔥結構類比計算機結構,結構包含資訊層、硬體層、程式設計層、作業系統層、應用程式層和通信層,基于洋蔥結構深入剖析了計算系統的每個分層,然後讨論了計算的限制。書中還穿插了大量的人物傳記、曆史點評、道德問題和新的技術發展資訊,有助于大家進一步了解計算機科學。
傳回目錄
教材導讀
Windows下Java開發環境,對于初學者推薦「JDK + Vim + PowerCMD」。如果感覺學Vim有點困難,初期可以使用「JDK + Atom + PowerCMD」。
Windows學習Java程式設計,要先掌握幾個常用的DOS指令,參考Java程式設計的DOS指令基礎進行學習。
Linux下Java開發環境,對于初學者推薦使用「Git+JDK+Vim」.在Ubuntu中的安裝指令git,vim是:
sudo apt-get install git
sudo apt-get install vim
Linux 版JDK下載下傳後,使用
tar -xzvf jdk-8u121-linux-x64.tar.gz; mv jdk-8u121 ~/jdk
進行解壓,然後通過
vi .bashrc
添加下面幾行設定環境變量:
export JAVA_HOME=~/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
如果你用的是MacBook的macOS作業系統,就不用安裝Ubuntu虛拟機了,把macOS當Linux用就行了。
對于IDE(Integrated Development Environment,內建開發環境),圖書上使用的是NetBeans,考慮到我們課程會涉及到Android開發,而用于Android開發的IDE Android Studio(CN)是在Intellij IDEA上建構的,是以我們上課推薦的IDE是Intellij IDEA。
Intellij IDEA是收費軟體,但對學生免費,可以到這裡申請免費使用。
這裡有IDEA的使用教程,包括不少視訊教程。IDEA的使用過程中要慢慢掌握常用的快捷鍵(哪個常用就刻意記憶一下,參考十大Intellij IDEA快捷鍵).IDEA的快捷鍵如下圖所示:
其他工具和教程參考「程式開發與資訊安全工具箱」。
課程相關資訊參考「《Java程式設計》 課程教學」。
相關連結
- 圖書範例下載下傳:
- Java程式設計與資料結構教程(第二版)源碼
- Java程式設計教程(第八版)源碼
- Java軟體結構與資料結構
注意,這些代碼都要求同學們自己一行一行的輸入,運作,調試;提供下載下傳連結主要是友善在遇到一些自己找不到的錯誤時對照用,千萬不要把代碼拷貝過去編譯運作一下就完了,這樣基本上什麼也學不到!!!
參考代碼驅動的程式設計學習中的「git的安裝測試」部分,建立與教材配套的目錄結構,目錄要展現出自己
學号姓名
,如下圖所示:
- Java 認證
本章教學目标
- 了解Java程式設計語言
- 了解程式編譯運作的步驟
- 了解問題求解的一般方法
- 了解軟體開發的一般過程
- 了解面向對象技術相關概念
Java程式設計語言
- Java平台:
- Java SE
- Java EE
- Java ME
- 類定義: public class XXX{}, 一定存為XXX.java
- main方法的定義是固定的:
public static void main(String [] args){}
- Java中有三種注釋:
//單行注釋
/*
多
行
注
釋
*/
/**
文
檔
注
釋
*/
- Java注釋通常要用完整的句子來寫,要展現意圖,說明為什麼這麼做,而不要說如何做的,下圖是注釋的一個反例,不要注釋明顯的東西:
- 文檔注釋結合javadoc工具使用,如何寫參考How to Write Doc Comments for the Javadoc Tool.也可以參考這個文檔。教材附錄I中也有相關内容。
- 辨別符和保留字
- 圖1.1中的Java保留字不用死記硬背,在學習過程中逐漸通過了解和應用進行記憶
- Java中辨別符是大小寫敏感的
- Java辨別符命名的規則
- 主要作為包、類、接口、成員方法、成員變量、常量、局部變量與參數等程式元素的名稱
- Java語言規定:辨別符由字母、數字、下劃線、$組成,第一個字元必須是字母,其字元序列的長度不限,但不允許與Java關鍵字(保留字)、布爾類型值(true、false)和空值(null)相同
- 辨別符中最好不使用貨币符($),因為這些符号常被用于内部處理
- 包、類、變量、方法等命名:要展現各自的含義
- 包、類、變量用名詞
- 方法名用動賓
- 包名全部小寫:io,awt
- 類名第一個字母要大寫:HelloWorldApp
- 變量名第一個字母要小寫:userName
- 方法名第一個字母要小寫:setName
- 辨別符的長度“min-length && max-information”
- Maxval PK maxValueUntilOverflow:太長也不好,3-5個單詞
- 去元音法則(慎用,隻用約定俗成的)
- returnValue->rtnVal
- message->msg
- 全局變量用具有描述性的名字,局部變量用短名字:單字元的名字,常見的如i,j,k等,作局部變量
- 辨別符應當直覺且可以拼讀,可望文知意,不必進行“解碼”
- 采用英文單詞或其組合,便于記憶和閱讀
- 切忌使用漢語拼音來命名
- 用詞要準确:例如“目前值”,CurrentValue不要寫成NowValue,更不要寫成dqz(目前值)
- 空白
- 寫代碼不是寫給機器的,是寫給人(程式員,甚至你自己)的,要注意可讀性
- 寫代碼要想寫書一樣,分章/節/段/句
- 對比一下程式1.1, 1.2, 1.3, 這三個程式都可以編譯,運作,隻有1.1的可讀性最好
- 推薦圖書
- 程式設計實踐(The Practice of Programming)
- 程式員修煉之道(The Pragmatic Programmer)
- 代碼整潔之道(Clean Code)
- 實作模式 (Implementation Patterns)
- 編寫可讀代碼的藝術(The Art of Readable Code)
- 代碼規範
- 阿裡集團Java 代碼規約
- Google Java 代碼規範
- Oracle Java代碼規範
程式開發
- 馮氏結構與存儲程式
- 馮·諾依曼體系結構的要點包括:
- 計算機硬體應由運算器、存儲器、控制器、輸入裝置、輸出裝置5大基本類型部件組成;
- 計算機内部采用二進制來表示指令和資料;
- 将編好的程式和資料先存入存儲器中,然後再啟動計算機工作,這就是存儲程式的基本含義。
- 計算機硬體的基礎是CPU,它與記憶體和輸入輸出裝置時行互動,從輸入裝置接收資料,向輸出裝置發送資料。CPU由運算器(算術邏輯單元ALU),控制器和一些寄存器組成。有一個非常重要的寄存器中叫程式計數器(Programming Counter,PC),在IA32中是EIP,訓示将要執行的下一條指令在存儲器中的位址。C/C++程式員可以認為EIP是一個指針,它總是指向記憶體的某一塊區域,我們把這塊區域稱為代碼段。CPU就是從EIP指向的那個位址取過來一條指令執行,執行完了之後IP會自加一,執行下一條指令,然後再取下一條指令執行,像貪吃蛇一樣總是在記憶體裡邊吃指令。
- CPU和記憶體和I/O裝置通過總線相連接配接。記憶體中存放指令和資料。指令和資料的功能和處理上是不同的,但都可以用二進制的方式存儲在記憶體中。
- 馮·諾依曼體系結構的核心是「存儲程式」。馮諾依曼體系結構就是存儲程式計算機。
- 上圖說明了“自動化”的要義
- 馮·諾依曼體系結構的要點包括:
- 程式設計語言
- 機器語言: 不同的CPU不同
- 彙編語言:機器語言的助記符
- 進階語言:可移植
- 第四代語言
- 編輯器/編譯程式和解釋程式
- Linux 指令行中可以使用
檢視源代碼的存儲情況od -tx1c src/01intro/Lincoln.java
- 了解圖1.4, 了解Java 程式「一次編譯,到處運作」主要是有了 位元組碼和JVM
- Linux 指令行中可以使用
- 開發環境
- JDK下載下傳位址在這, 相關文檔中說明了JDK,JRE,JVM的差別:
- IDE: Intellj IDEA, 參考Intellj IDEA 簡易教程.
- 文法和語義
- 文法規定程式的格式。不合文法的程式是無法編譯的。
- 語義規定程式語句的意義。
- 錯誤
- 三類錯誤
- 編譯時錯誤:文法錯誤,初學者易犯
- 運作時錯誤:異常處理
- 邏輯錯誤:要學會通過調試(debug)來定位錯誤(Java中使用JDB)
- 自頂向下進行調試
- 學會設定斷點(行斷點/函數斷點/條件斷點/臨時斷點)
- 學會單步運作
- 循環的調試
- 函數的調試
- 二分法定位錯誤
- 三類錯誤
問題求解
- 軟體開發的核心是問題求解,編寫程式是為了解決問題。解決問題的能力是一切工作的根本。
- 一般步驟
- 了解問題
- 設計方案
- 考慮方案的選擇并優化方案
- 實作方案
- 測試方案并修改存在的問題
軟體開發行為
- 軟體開發
- 建立需求:做什麼?
- 生成設計:如何做?
- 實作設計:設計到代碼
- 測試:做對沒?
- 三種代碼
- 僞代碼
- 産品代碼
- 測試代碼
- 三個公式
- 程式 = 算法 + 資料結構
- 軟體 = 程式 + 軟體工程
- 軟體企業 = 軟體 + 商業模式
- 推薦圖書:
- 建構之法(電子版)
- 代碼大全(Code Complete)
- 代碼閱讀
面向對象程式設計
- 概念:
- 對象
- 類
- 屬性
- 方法
- 面向對象三要素:封裝,繼承,多态
- 繼承可以複用,更重要的是用繼承實作多态;封裝是繼承的基礎;繼承是多态的基礎。
-
- UML精粹(UML Distilled)
自測題
- 練習一下,并對照答案查漏補缺
- 每周測試會有題目出現
- SR1.8:
- OO基本元素:對象,類,封裝,繼承,多态;繼承可以複用,更重要的是用繼承實作多态;封裝是繼承的基礎;繼承是多态的基礎。
練習
- 會在每周考試中展現
程式設計項目
- 至少完成 PP1.1, PP1.2
動手實踐
- p2 Linconln.java
- 按前面的目錄結構,我的工作目錄如下(你要用自己的學号姓名資訊建目錄)
- 代碼編輯我們推薦使用Vim或Atom,Vim學習參考做中學之Vim實踐教程,如上圖,我們使用
來編輯Lincoln.java,注意類名和檔案名要一緻,注間1與l的差別:vim src/01intro/Lincoln.java
//********************************************************************
// Lincoln.java Java Foundations
//
// Demonstrates the basic structure of a Java application.
//********************************************************************
public class Lincoln{
//-----------------------------------------------------------------
// Prints a presidential quote.
//-----------------------------------------------------------------
public static void main (String[] args){
System.out.println ("A quote by Abraham Lincoln:");
System.out.println ("Whatever you are, be a good one.");
}
}
- 教材上的代碼風格值得學習,代碼學習如何進行注釋,類定義,方法定義。
- 代碼編譯指令:`javac src/01intro/Lincoln.java -d ./bin`
- 代碼運作指令:`cd bin;java Lincoln;cd..`; 如下圖:
- Java8 規範
- Java 官網
- OpenJDK 官網
- JDK下載下傳
- Java SE - Change in Version Numbering Scheme
- Java8 Documents
- Java8 API
- The Java Tutorial
拓展
- 計算機科學概論(Computer Science Illuminated)第一部分,第三部分
字元串
- print, println, printf
- printf見拓展内容
- println == printf("\n")
- 幫助文檔的使用
- 參考積極主動敲代碼,使用JUnit學習Java
- 字元串連接配接 +
- 轉義字元 ''
變量和指派
- 變量:變量名和變量值 與記憶體的對應
- 指派
- 常量:final
- 全大寫
- DRY
- 消除魔數(Magic Number)
基本資料類型
- 8 種基本類型(byte,short,int,long,float,double,boolean,char)
- 6種數字類型(byte,short,int,long,float,double)
- 4種整數類型(byte,short,int,long),
- char占兩個位元組
- boolean隻有true和false
- 注意取值範圍和溢出(圖2.2)
- 整數是補碼表示的(負數取反加一)
- 浮點數參考IEEE754标準:誰用Java寫個轉換器有加分
- float
- double
- 另一個電腦
- 表示過程
- 字面量
- 23 預設是int 類型
- 23l和23L是long類型(注意l和1的差別,long類型隻用L綴)
- 23.0 預設是double類型
- 23.0f和23.0F是float類型
表達式
- 算術運算
- +
- -
- *
- /
- %: 密碼學上常用
- 關系運算:注意不要對浮點數進行相等性運算,可以試試
?1.0-0.7==0.3
- >、>=、<、<=、==、!=
- Conditional Operator: 條件表達式 ? 成立時傳回值:失敗時傳回值
- 邏輯運算:運算結果是boolean值:true Or false
- 與(&&)
- 或(||)
- 非(!)
- 位運算位運算(P486附錄D.1):運算結果為位串(位向量),常用于掩碼(Mask)運算
- 與(&):全1為1,有0則0
- 或(|):全0為0,有1則1
- 非(~):書上說是
,按我們的習慣應該是補碼
反碼
- 異或(^):相同為0,不同為1
- 左移(<<):最右補0
- 算術右移(>>):右移後,正數最高位補0,負數最高位補1
- 邏輯右移(>>>):右移後,最高位總是補0
- 自增,自減(上下兩行的差別)
- i++,i--
- ++i,--i
-
- =
- +=, -=, *=, /=, %=,&=, |=, ^=, <<=, >>=
- 運算符優先級(不用刻意記)
- 除了先乘除後加減,其他的用()
- 注意()的作用
資料轉換
- 加寬和縮窄
- 縮窄要進行強制類型轉換
- 三種轉換
- 指派轉換
- 提升
- 強制類型轉換
讀輸入資料
- 标準輸入System.in
- 标準輸入System.out
- 輸出
- System.out.print
- System.out.println
- System.out.printf
- 輸入
- Scanner
- 至少完成PP2.2, PP2.4, PP2.6, PP2.80, PP2.10
- 自己寫的代碼找一個同學用用,看看能發現什麼問題
- 每章有一些代碼段,同學們可以自己建一個測試類把書上的代碼段輸入到main方法來運作一下這些代碼,比如第二章可以通過
建個測試類vi Ch02Test.java
public class Ch02Test {
public static void main(String [] args) {
}
}
- p21 Countdown.java
- 加點代碼用用printf,與print,println對比一下
- p22 Facts.java
- p23 Additions.java
- p24 Roses.java
- p25 Pianokeys.java
- p26 Geometry.java
- p33 TempConverter.java
- p38 Echo.java
- 加點代碼看看8種基本類型都怎麼輸入
- p39 GasMileage.java
- 本章代碼不少數是固定的,如何修改一下上面的代碼,讓使用者進行輸入
- printf:教材3.6節
- 計算機科學概論(Computer Science Illuminated)第二部分
建立對象
- 基本資料類型與引用類型(類類型,自定義類型)
- Java API: p49類庫,前面第一章開發環境的講解
- 開發程式時類庫非常有用
- 學習Java,很大程度上要學習Java的API
- new:傳回指向建立對象的引用
-
String s = new String();
- s是引用,在棧上
- new String()在堆上生成對象
- 别名:引用儲存的記憶體位址
- 多個引用變量可以指向同一個對象
-
String 類
- 建立字元串最常用的方式不是使用new,而是用字元串指派
- 參考積極主動敲代碼,使用Junit學習Java程式設計:常看直到掌握學習方法
- 什麼是方法?參考P112 方法的解析
- 方法調用: 對象名.方法名(參數)
- 方法需要對象調用,不同的對象決定着同一方法調用的不同結果
包
- 大型項目:子系統
- Java API是按包分組的,p50圖3.2
- 重點:java.lang,java.util,java.math.java.io,java.net,java.sql,java.security,java.text...
- package與import
- 編譯運作
- javac -d . XXX.java
- java xx.xxx.XXX
- java.lang包中的類自動import到每個程式中
- 編譯運作
Random類
- 密碼學中意義重大
- 僞随機數生成器執行複雜的計算産生随機數
- Math.random()更友善
Math類
- Math類中的方法都是static的可以用Math.XXX()來調用。
格式化輸出
- NumberFormat
- DecimalFormat
- print,println,printf
枚舉類型
- enum與final
- 枚舉是類型安全的,可以保證不會使用非法的值
- 枚舉序數從0開始
包裝類
- 基本類型與引用類型
- 包裝類是一種特殊的基本類型,能夠按對象的方式處理基本類型。
- p60 圖3.7
- 字元串與數字的轉換
- String.parse()
- “”+20
- 數字解析:Integer.parseInt(“20")
- 自動包裝(autoboxing)與拆包(unboxing)
- 自動包裝提供基本資料類型與對應包裝類之間的轉換
- 至少完成PP3.1,pp3.3,pp3.5
- 要有一個結對學習的夥伴
- 每章有一些代碼段,同學們可以自己建一個測試類把書上的代碼段輸入到main方法來運作一下這些代碼,比如第三章可以通過
vi Ch03Test.java
public class Ch03Test {
public static void main(String [] args) {
}
}
- p48 StringMutation.java
- 參考積極主動敲代碼,使用Junit學習Java程式設計
- 學習String類的幫助文檔
- 參考幫助文檔加點代碼
- 調用一些新方法
- p51 RandomNumbers.java:Random類
- 學習Random類的幫助文檔
- 修改代碼生成自己想要的範圍
- 密碼學中常用
- p53 Quadratic.java:Math類
- 學習Math類的幫助文檔
- 測試一些新的方法
- p55 Purchase.java: NumberFormat類
- 注意這Numberformat類生成對象沒用使用new,使用了工廠方法
- 定義常量消除魔數(magic numbers):DRY
- p56 CircleStats.java:DecimalFormat類
- p58 IceCream.java: enum
- 學習Java要學會使用Java API
- 在Windows下一定要下載下傳CHM格式的Java API,這個版本具有檢索功能,使用非常友善
- macOS中下載下傳Dash
- 參考「Java:String、StringBuffer和StringBuilder的差別 」,特别是其中的「使用政策」
- 參考「java中String、StringBuffer、StringBuilder的差別」
布爾表達式
- 控制流:順序(存儲程式)/分支(條件語句,特殊情況)/循環(自動化)
- 分支和循環:依賴布爾表達式
- 相等與關系運算
- 主要用于整數(byte,short,int,long)
- 結果是boolean類型
- 注意優先級,善用“()”
- 邏輯運算符
- 了解真值表
- 了解短路
- 所有複雜的邏輯表達式都可以用“與或非”來表達(最大項,最小項)
if語句
- Linux 下可以用dia(sudo apt-get install dia) 來畫流程圖
- 縮進有利于提高代碼可讀性(vim中 :set ai)
- if
- if...else
- 塊語句
- 完成複雜功能
- 縮進不能代替{}
- 三元條件運算符
- if...else if ... esle
- else的就近原則
資料比較
- 浮點數的比較:使用公差
- 字元比較:Unicode順序
- ASCII表中的大小寫字母,數字要熟記編碼
- 對角比較:equals
switch語句
- 在Java7之前,switch隻能支援 byte、short、char、int或者其對應的封裝類以及Enum類型。在Java7之後,支援String
- switch與嵌套if的等價轉換
- MESE原則 (Mutually Exclusive Collectively Exhaustive,“互相獨立,完全窮盡”)
- break
- default
while語句
- 循環不變式
- 避免死循環(Ctrl+C退出)
- 嵌套的循環
- break可以跳出多重循環
- break與continue的差別
疊代器
- Java Collection中會細講
- 此處了解就行
do 語句
- do ... while
for 語句
- 與while等價
- for(;;)死循環
- for-each了解
- 至少完成PP4.1, PP4.8, PP4.15
- 每章有一些代碼段,同學們可以自己建一個測試類把書上的代碼段輸入到main方法來運作一下這些代碼,比如第四章可以通過
vi Ch04Test.java
public class Ch03Test {
public static void main(String [] args) {
}
}
- p68 Age.java: if 語句
- 定義常量MINOR,不要使用magic number
- 可以把代碼下面的内容輸入測試一下
- p70 Wages.java: if...else
- MESE
- if 和 else下面的代碼換換位置,if語句如何改寫?
- P71 Guessing.java: 塊語句
- p74 MinofThree.java:嵌套的if
- 臨時變量的min的使用看懂,能力會大大增強
- 嘗試寫一段代碼把int a; int b;的值交換一下
- p78 GradeReport.java: switch
- switch 和if 等價,嘗試用if改寫本代碼
- 嘗試用switch...case改寫上面的代碼
- p80 Average.java: while
- Scanner中nextInt後不能緊接着nextLine
- p82 WinPercentage.java :輸入驗證
- 代碼的健壯性(Robust)
- 錯誤處理在程式設計中很重要
- 引發安全問題的錯誤代碼叫漏洞
- p84 PalindromTester.java:嵌套的循環
- 處理複雜情況
- 嘗試輸入一個非常長的字元串,多長程式會崩潰?
- p87 URLDissector.java: Scanner讀檔案
- 了解一下Linux輸入重定向
- 查幫助文檔學習File類
- 學習一下Linux下的stat,cat指令
- 深入學習一下 ls -l
- p90 Reverse.java : do...while
- 用while改寫一下本代碼,功能不變
- 用for改寫一下本代碼,功能不變
- p92 Multiple.java:for
- p93 Multiple.java:嵌套for
- 卡諾圖
- 查表法
- 再談類和對象
- 類:自定義類型
- 類是對象的藍圖
-
- 狀态:屬性
- 行為:操作
- 類的設計:抽象
- 名詞
- 類:複數
- 對象:單數
- 屬性:
- 支撐類
- 代碼複用:站在前人的肩膀上
- 系統類庫
- 開源類庫
- 購買
- 職責配置設定,方法設計
- 動詞
- 方法放入哪個類中?
- SRP(單一職責原則)
- 名詞
- 類的剖析
- 變量的作用域:程式中能引用變量的區域
- 執行個體資料的
- UML類圖
- 關聯
- 封裝
- public ,private
- 可見性在UML中的表達
- 方法的剖析
- 參數的設計:程式中的變化部分
- 形參
- 實參
- return:傳回值
- 局部資料
- 靜态類成員
- 類成員
- 類.類成員引用
- 類關系
- 依賴
- 聚合
- UML中的表示
- this
- 方法設計
- 方法的分解
- 參數傳遞:
- 傳值
- 傳引用
- 方法重載
- 參數類型與數量
- 不管傳回值
- 測試
- 代碼評審,走查
- 結對
- 缺陷測試: 品質保證
- 單元測試: 子產品測試
- 測試代碼不少于産品代碼
- 積極主動敲代碼,使用JUnit學習Java
- 內建測試:系統大元件的正确性
- 回歸測試
- 系統測試:與需求的緻性
- alpha 測試
- beta 測試
- TDD:測試驅動開發
- refactor: 重構
- 代碼評審,走查
- 調試
- 使用JDB調試Java程式
- IDEA中調試
- 至少完成PP5.3,PP5.6, PP5.13
- 每章有一些代碼段,同學們可以自己建一個測試類把書上的代碼段輸入到main方法來運作一下這些代碼,比如第五章可以通過
vi Ch05Test.java
public class Ch03Test {
public static void main(String [] args) {
}
}
- p103 SnakeEyes.java: 定義測試類
- p104 Die.java: 定義類
- 以上兩個代碼要放同一個檔案夾下
- 一類一檔案
-
- javac -d bin src/05class/*.java
- 方法注釋
- public String toString()上面加個@Override:自己寫的所有的類最好都有toString()方法
- Dia d; Systerm.out.println(d)等價于Systerm.out.println(d.toString())
- PP5.10
- UML模組化
- p109 CountFlips.java: 定義測試類
- P110 Coin.java: 定義類,通路控制
- 修改代碼試試public ,private的不同
- PP5.1
- PP5.2
- PP5.3
- p113 Transactions.java: 定義測試類
- p114 Account.java:定義類,方法
- P114輸出結果有誤
- PP5.12
- P120 SloganCounter.java: 定義測試類
- P121 Slogan.java: 定義類,static
- 靜态成員能用對象引用嗎?
- public static 定義常量
- P123 RationalTester.java: 定義測試類
- P124 RationalNumber.java:定義類,有理數
- 注意加減乘除的定義,隻有一個參數
- P129 PigLatin.java:
- P130 PigLatinTranslator.java
- private 方法
- 方法分解
- P132 ParameterTest.java: 定義測試類
- P133 ParameterModifier.java: 定義類
- P134 Num.java: 工具類
- 函數參數傳基本類型和引用類型的不同
- 用JDB跟蹤一下
- 面向對象設計的SOLID原則
第六章 圖形使用者界面(自學,不納入考試)
- GUI四要素(元件,容器,布局,事件)
- 有哪些元件?
- 有哪些容器?元件要放在容器中
- 有哪些布局?元件要放在容器中的什麼位置
- 如何進行事件處理?
- 元件
- 容器
- 布局
- 事件
- 事件處理的四種方式
- GUI設計
- 至少完成PP
數組容納相同類型的多個元素,友善我們用循環統一處理。
- 數組元素
- 在記憶體中如何存放
- Java中數組索引從0開始
- 數組的聲明及使用
- Java數組是對象,要用new執行個體化,new指定大小,之後數組大小不能改變
- int [] arr = new int[11];
- int arr [] = new int[11]
- Java中訪數組元素不能越界,用數組的length屬性控制
- for each文法
- for( int i : arr) {System.out.pintln(i);} 等價于
- for( int i=0; i<arr.length; i++ ) {System.out.pintln(arr[i]);}
- []的優先級最高
- 第一次聲明數組可以使用初值表代替new執行個體化數組
- int[] scores = {99, 100, 85};
- 數組可以作為方法的參數
- Java數組是對象,要用new執行個體化,new指定大小,之後數組大小不能改變
- 對象數組
- 對象數組的執行個體化,隻是配置設定了儲存引用的空間,每個元素中儲存的對象還必須分别執行個體化
- String [] words = new String[5]:一個String對象也沒有
- 對象數組的執行個體化,隻是配置設定了儲存引用的空間,每個元素中儲存的對象還必須分别執行個體化
- 指令行參數
- args[0]的值是類名
- args是字元串數組
- 變長參數表
- 變長參數必須是方法的最後一個參數
- 二維數組
- 多元數組
- 二維數組是一維數組的數組
- M*N的表 :int[][] arr = new int[M][N];
- 用嵌套循環周遊
- 三維數組是二維數組的數組
- ...
- 二維數組是一維數組的數組
- 鋸齒狀數組
- 多元數組
- 每章有一些代碼段,同學們可以自己建一個測試類把書上的代碼段輸入到main方法來運作一下這些代碼,比如第七章可以通過
vi Ch07Test.java
public class Ch03Test {
public static void main(String [] args) {
}
}
- p204 BasicArray.java : 數組
- 兩種for文法
- 嘗試修一下代碼,用for...each初始化
- 常量定義消除魔數
- p206 ReverseOrder.java: length
- length的使用
- 嘗試列印 numbers[numbers.length]的值
- for中,索引可增可減
- p207 LetterCount.java: String是字元數組
- 檢視API文檔,學習String類中的相關方法
- 如何判斷一個字元的範圍?
- current - 'A' 是幹嗎的?
- 使用Character類的isUpperCase和isLowerCase方法改寫代碼
- p210 Prime.java: 初值表
- p212 GradeRange.java : 對象數組,測試類
- p212 Grade.java:
- 自定義類一般都要有toString()
- 用對象初值表初始化對象數組
- p213 Tunes.java :對象數組,測試類
- p215 CDCollection.java: 數組管理
- p216 CD.java
- CDCollection可以用ArrayList替換,改寫一下Tunes.java
- p218 CommandLine.java: args數組
- 期望java CommandLine 1 2 3 輸出1,2,3的和,如何改代碼?
- p219 VariableParameters.java: 變長參數,測試類
- p220 Family.java:
- 變長參數和數組什麼關系?
- p221 TwoDArray.java: 二維數組
- for...each改寫代碼
- p222 SodaSurvey.java: 初始值表初始化二維數組
- 不定義常量用for...each寫代碼可行嗎?
- 學習java.util.Arrays
- 學習java.util.ArrayList
- 建立子類
- extends
- 繼承的作用之一是代碼複用
- 繼承建立了ISA關系
- 正方形能繼承長方形嗎?
- UML類圖中的繼承表示
- proteced
- super與this
- 常用于調用構造方法
- Java隻支援單繼承
- 方法的重寫(Override)
- 重載與重寫的差別
- 子類中的方法與父類一樣是重寫,可以用@Override從文法上保證
- 子類中的方法與父類參數不一樣是重載
- 避免隐藏變量
- 類層次
- 類層次中公共特性放父類中
- Java API學習要明白類層次關系
- 學習從父類學起效率高
- Object類是所有類的父類
- toString()
- equals()
- hashCode():與equals一起使用
- abstract 與抽象類
- 抽象類表達抽象概念,不能用new執行個體化
- UML中的抽象類
- 抽象類的子類
- 實作父類的抽象方法變成具體類
- 不實作父類抽象方法仍要用abstract修飾
- 類層次中公共特性放父類中
- 可見性
- public protected 包 private 四種通路控制的差別
- 設計繼承
- final 禁止繼承
- 每章有一些代碼段,同學們可以自己建一個測試類把書上的代碼段輸入到main方法來運作一下這些代碼,比如第八章可以通過
vi Ch08Test.java
public class Ch03Test {
public static void main(String [] args) {
}
}
- p229 Words.java: 測試類
- p230 Book.java: 父類
- p230 Dictionary.java:子類
- 體會ISA
- UML圖在StarUML中畫一下
- p232 Words2.java: 測試類
- p233 Book2.java: 父類
- p234 Dictionary2.java:子類
- super
- p235 Messages.java: 測試類
- p236 Thought.java: 父類
- p236 Advice.java:子類
- Override
- Advice dates = new Advice(); 改成 Thought dates = new Advice();結果會怎樣?
- p240 FoodAnalyzer.java : 測試類
- p241 FoodItem.java:父類
- p241 Pizza.java:子類
- private
- 如何重寫hashCode()和equals()方法
- 後綁定
- 多态引用在不同的時候可以指向不同類型的對象
- 用父類聲明引用,用子類生成對象,就産生了多态
- 多态引用運作時才将方法調用與它的定義綁定在一起
- 多态引用在不同的時候可以指向不同類型的對象
- 通過繼承實作多态
- 引用變量可以指向聲明繼承于它的任意類的任何對象
- 對象的類型,而不是引用的類型,決定調用是方法的哪個版本
- 接口
- interface,implements 等價于class,extends
- 接口是一組抽象方法,與抽象類一樣不能被執行個體化
- 接口層次
- 接口可以繼承接口
- 類可以實作接口,但不能繼承接口
- Comparable接口
- compareTo()
- Iterator接口
- hasNext()
- nextZ()
- 通過接口實作多态
- 和class一樣,接口可以用來聲明對象引用變量
- 接口引用可以指向實作這個接口的任意類的作何對象
- 方法的參數可以是多态的
- 9.4.1不用看
-
vi Ch07Test.java
public class Ch03Test {
public static void main(String [] args) {
}
}
- p248 Firm.java: 測試類
- p249 Staff.java: 測試類
- p251 StafMemeber.java:父類
- p251 Volunteer.java:子類
- p252 Employee.java:子類
- p253 Executive.java:子類
- p253 Hourly.java:子類
- 了解P248的UML圖
- 産生多态的是StaffMember中的pay()
- PP9.1
- PP9.2
- p255 Encryptable.java: 接口
- p255 Secret.java: 實作接口
- p257 SecretTest.java: 測試類
- 了解P257 UML 圖
- shift是密鑰
- message是明文和密文
- PP9.4
- 凱撒密碼
- 異常處理
- 錯誤和異常代表不常見的或不正确處理的對象
- 錯誤(Error)不用捕獲
- 處理異常
- 不處理,程式崩潰
- 在異常發生的地方處理
- 在程式的其他地方處理
- 不捕獲異常
- 程式中出現異常不捕獲異常,程式會崩潰
- 抛出異常時輸出的消息提供方法調用棧的的軌迹
- 調用棧跟蹤(call stack trace)
- 第一行給出原因,異常類型
- 棧的第一行給出産生異常的代碼(這個般就是産生異常的原因)
- try-catch 語句
- Java中把正常流程放try塊中,錯誤(異常)處理放catch塊中
- 每個catch 子句處理try塊中可能抛出的一種特定類型的異常
- API文檔中帶throws的必須使用try...catch,如下圖
- 注意多個catch一定把父類放後面處理
- finally:總會執行,用于資源管理
- 異常傳播
- 如果沒有在異常發生處捕獲及處理,異常會被傳播給調用的方法
- catch or throw?(如果要産生異常,程式員必須仔細考慮如何及在哪裡處理異常)
- throws:自己無法處理,用在方法聲明
- throw:方法中抛出Checked Exception,方法聲明中必須有throws
- 異常類的層次
- Error及其子類寫程式不用處理,最多留個日志
- Java異常處理是要處理
類及其子類(Checked Exception)Exception
-
及其子類也不用處理(Unchecked Exception),是免檢異常RuntimeException
- 産生
的問題在調用代碼RuntimeException
- 參考Design by Contract (DBC) 契約式設計
-
- Multi-catch:類之間不能有繼承關系
- 學習Java API時一定對上層的類好好研究,學習,再學習和應用子類時就比較容易了
- 自定義異常
- I/O異常
- 先學習I/O
- 幾乎所有的IO API都可能抛出異常
- 流是位元組序列
- 位元組流
- 字元流
- 标準流
- System.in
- System.out
- System.err
- 先學習I/O
-
vi Ch07Test.java
public class Ch03Test {
public static void main(String [] args) {
}
}
- p265 Zero.java: 除0異常
- 用try...catch 修改一下代碼,保證程式不崩潰,最後一行能列印出來
- p267 ProductCodes.java
- 查找API文檔,了解StringIndexOutOfBoundsException, NumberFormExcetion産生的原因
- 代碼中哪些方法會導緻上面兩個異常的産生
- 了解substring兩個參數的含義
- p269 Propagation.java: 測試類
- p269 ExceptionScope.java: 異常傳播
- 先想一下運作結果,再跟實際比較一下
- level3 ->level2 ->level1才處理
- 了解棧調用跟蹤的資訊
- p271 CreatingExceptions.java: 自定義異常的測試類
- p272 OutOfRangeExcepton.java: 自定義異常類
- 自定義異常用throw抛出
- 什麼時候使用異常,要好好思考
- p274 TestData.java: IO異常
- 寫入文本檔案
- 遞歸思想
- 遞歸程式設計
- 使用遞歸
-
vi Ch07Test.java
public class Ch03Test {
public static void main(String [] args) {
}
}
- 算法效率
- 增長函數和大O符号
- 比較增長函數
-
vi Ch07Test.java
public class Ch03Test {
public static void main(String [] args) {
}
}
- 查找
- 排序
- 分析查找和排序算法
-
vi Ch07Test.java
public class Ch03Test {
public static void main(String [] args) {
}
}
- 集合的介紹
- 棧集合
- 繼承,多态和泛型
- 棧的ADT
- 使用棧:計算字尾表達式
- 異常
- 使用數組實作棧
- ArrayStack類
- 将引用作為鍊
- 管理連結清單
- 沒有鍊的元素
- 使用鍊實作棧
- 使用java.util.Stack 類實作棧
-
vi Ch07Test.java
public class Ch03Test {
public static void main(String [] args) {
}
}
- 隊列ADT
- 使用隊列:編碼K值
- 使用隊列:模拟票務櫃台
- 實作隊列:使用連結清單
- 實作隊列:使用數組
-
vi Ch07Test.java
public class Ch03Test {
public static void main(String [] args) {
}
}
- 樹
- 樹的周遊
- 樹的實作政策
- 二叉樹的實作
- 決策樹
-
vi Ch07Test.java
public class Ch03Test {
public static void main(String [] args) {
}
}
- 二叉查找樹
- 二叉查找樹的實作
- 平衡二叉查找樹
-
vi Ch07Test.java
public class Ch03Test {
public static void main(String [] args) {
}
}
- 堆
- 堆的實作
- 堆排序
- 優先隊列
-
vi Ch07Test.java
public class Ch03Test {
public static void main(String [] args) {
}
}
- 無向圖
- 有向圖
- 帶權圖
- 常用的圖算法
- 圖的實作政策
-
vi Ch07Test.java
public class Ch03Test {
public static void main(String [] args) {
}
}
- 哈希方法
- 哈希函數
- 解決沖突
- 從哈希表中删除元素
- Java Collection API中的哈希表
-
vi Ch07Test.java
public class Ch03Test {
public static void main(String [] args) {
}
}
- 資料庫介紹
- 建立與資料庫的連結
- 建立并修改資料庫表
- 查詢資料庫
- 插入/檢視及更新資料
- 删除資料和資料庫表
-
vi Ch07Test.java
public class Ch03Test {
public static void main(String [] args) {
}
}
參考資料
- Java程式設計與資料結構教程(第二版) (Java Foundations,官網)
- 《Java學習筆記(第8版)》學習指導
歡迎關注“rocedu”微信公衆号(手機上長按二維碼)
做中教,做中學,實踐中共同進步!
- 原文位址:http://www.cnblogs.com/rocedu/p/6064234.html
- 推薦網站:部落格園、新浪微網誌、扇貝背單詞、DKY背單詞小組、有道雲筆記、豆瓣讀書
- 版權聲明:自由轉載-非商用-非衍生-保持署名| Creative Commons BY-NC-ND 3.0
如果你覺得本文對你有幫助,請點一下左下角的“好文要頂”和“收藏該文”