Java語言已成為軟件設計開發者應掌握的一門基礎語言。本書為Java課程設計指導用書,共分11章,具體內容包括:Java環境的安裝與配置、Java語言編程的基礎知識、Java語言中重要的類與對象、網頁瀏覽器案例、成績查詢APP設計案例、消息推送APP設計案例、端口掃描器案例、聊天程序案例、中國象棋對弈系統案例、資產管理系統案例和人事管理系統案例。
本書以案例帶動知識點的講解,展示實際項目的設計思想和設計理念,使讀者可以舉一反三。本書每個實例各有側重點,避免了實例羅列和知識點重復。本書選擇目前流行的APP設計及高校課程設計的典型項目,并注重切合實際應用,使讀者能夠真正做到學以致用。
本書適合作為高等院校學生學習Java課程設計的教材,也可作為Java語言程序開發人員及Java編程愛好者的指導用書。
本書語言通俗,簡明實用,并通過實例來解釋相關的概念和方法,有助于讀者理解和掌握Java語言編程方法。書中各個案例相互獨立,均給出了詳細的設計步驟,包括功能描述、理論基礎、總體設計、代碼實現、程序運行與發布等,而且代碼都有詳細的注釋,便于讀者閱讀。
本書前兩版受到了廣泛歡迎,應廣大讀者的要求,作者于2015年進行了第3版修訂。為了滿足廣大讀者對當前流行的APP設計開發的需求,新版書中更新了原第5章(蜘蛛紙牌)和第6章(吃豆子游戲)兩個案例,將其分別改為成績查詢APP和消息推送APP。其中,成績查詢APP設計結合當前校園信息化建設實際需求,詳細講解了如何利用移動客戶端APP來查詢學生的考試成績;消息推送APP則結合當前常用的向移動客戶端推送消息的實際應用需求,對如何利用第三方推送平臺,從移動客戶端"接收消息"、"打開鏈接"、"管理消息"等進行了詳盡分析,對關鍵代碼重點講解。作者希望借助新增的案例,向讀者講解APP的設計方式與功能實現的方式,以達到舉一反三的目的。
前 言
Java語言的出現迎合了人們對應用程序跨平臺運行的需求,已成為軟件設計開發者應掌握的一門基礎語言,很多新的技術領域都涉及Java語言。目前無論是高校的計算機專業還是IT培訓學校都將Java語言作為主要的教學內容之一,這對于培養學生的計算機應用能力具有重要的意義,掌握Java語言已經成為人們的共識。
在掌握了Java語言的基本知識之后,如何快速有效地提高Java語言編程技術成為大家普遍關注的問題。實踐證明,案例教學是計算機語言教學最有效的方法之一。好的案例對理解知識和掌握應用方法十分重要。本書語言通俗,簡明實用,并通過實例來解釋相關的概念和方法,有助于讀者理解和掌握Java語言編程方法。書中各個案例相互獨立,均給出了詳細的設計步驟,包括功能描述、理論基礎、總體設計、代碼實現、程序運行與發布等,而且代碼都有詳細的注釋,便于讀者閱讀。
本書自2010年第2版出版以來,受到了廣大讀者的一致好評,有很多熱心讀者來電討論書中的相關技術問題,并詢問第3版的信息。應廣大讀者的要求,作者于2015年對本書又進行了第3版修訂。為了滿足廣大讀者對當前流行的APP設計開發的需求,新版書中更新了原第5章(蜘蛛紙牌)和第6章(吃豆子游戲)兩個案例,將其分別改為成績查詢APP和消息推送APP。其中,成績查詢APP設計結合當前校園信息化建設實際需求,詳細講解了如何利用移動客戶端APP來查詢學生的考試成績;消息推送APP則結合當前常用的向移動客戶端推送消息的實際應用需求,對如何利用第三方推送平臺,從移動客戶端"接收消息"、"打開鏈接"、"管理消息"等進行了詳盡分析,對關鍵代碼重點講解。作者希望借助新增的案例,向讀者講解APP的設計方式與功能實現的方式,以達到舉一反三的目的。
在此,再次感謝廣大讀者對本書的支持,也感謝熱心讀者對本書再版提出的意見和建議,希望大家今后一如既往地提出寶貴意見。謝謝!
本書所有案例程序都在JDK 1.6運行環境下及AndroidStudio(Android 4.0.3)環境下調試通過。本書代碼僅供學習Java語言使用,歡迎讀者對不妥之處提出批評和建議。
本書由張建軍、吳啟武主編,同時參與編寫的人員還有張廣彬、王小寧、高靜、張紅朝、余健。由于作者水平有限,書中難免存在疏漏和不足,懇請讀者提出寶貴意見,使本書再版時得以改進和完善。
編 者
第1章 Java概述 1
1.1 Java語言簡介 2
1.1.1 Java語言的歷史 2
1.1.2 Java語言的特點 2
1.2 Java平臺 4
1.2.1 Java平臺簡介 4
1.2.2 Java虛擬機 4
1.3 Java運行環境的建立 5
1.3.1 JDK簡介 5
1.3.2 JDK的安裝 5
1.3.3 JDK運行環境的設置 5
1.3.4 JDK包含的常用工具 7
1.4 JDK 1.6的新特性 8
1.5 Java程序的編寫、編譯和運行 10
1.5.1 Java程序的編譯與運行 10
1.5.2 簡單的Java程序舉例 11
1.5.3 Java的注釋 13
第2章 Java程序設計基礎 15
2.1 Java的基本數據類型 16
2.1.1 數據類型 16
2.1.2 標識符與關鍵字 16
2.1.3 常量 17
2.1.4 變量 19
2.2 Java運算符與表達式 21
2.2.1 算術運算符 21
2.2.2 關系運算符 21
2.2.3 布爾運算符 22
2.2.4 位運算符 22
2.2.5 賦值運算符 22
2.2.6 條件運算符 24
2.2.7 表達式和運算符的優先級 24
2.3 Java控制語句 25
2.3.1 選擇結構 25
2.3.2 循環結構 26
2.3.3 跳轉結構 28
2.4 字符串 29
2.4.1 String類 30
2.4.2 StringBuffer類 31
2.5 數組 32
2.5.1 一維數組 32
2.5.2 多維數組 34
2.5.3 對象數組 35
第3章 類和對象 37
3.1 類的定義與使用 38
3.1.1 類的定義 38
3.1.2 構造函數 41
3.1.3 對象的使用 42
3.1.4 訪問控制 43
3.2 繼承 44
3.3 重載 45
3.3.1 方法的重載 45
3.3.2 構造函數的重載 47
3.3.3 super與this 48
3.4 包與接口 51
3.4.1 包與引用包 51
3.4.2 ClassPath環境變量 52
3.4.3 接口 52
3.5 Java的垃圾回收與析構 53
3.6 抽象類與內部類 54
3.6.1 抽象類 54
3.6.2 內部類 54
3.7 基礎類的使用 55
3.7.1 基礎類庫 55
3.7.2 Math類 59
3.7.3 時間與日期的處理 61
第4章 網頁瀏覽器的開發 67
4.1 功能描述 68
4.2 理論基礎 68
4.2.1 事件處理 68
4.2.2 Swing相關組件 70
4.2.3 輸入輸出 76
4.3 總體設計 80
4.4 代碼實現 81
4.4.1 WebBrowser.java 81
4.4.2 ViewSourceFrame.java 91
4.5 程序的運行與發布 92
4.5.1 運行程序 92
4.5.2 發布程序 94
第5章 成績查詢APP設計 95
5.1 功能描述 96
5.2 理論基礎 96
5.2.1 Http請求 96
5.2.2 Wireshark軟件的使用 97
5.2.3 數據解析 98
5.2.4 SimpleAdapter的應用 100
5.3 總體設計 101
5.3.1 登錄教務系統 101
5.3.2 獲取并顯示成績 101
5.4 代碼實現 102
5.4.1 登錄功能 102
5.4.2 獲取成績 109
5.4.3 顯示成績 117
5.5 程序的運行與發布 122
5.5.1 運行程序 122
5.5.2 發布程序 124
第6章 消息推送APP設計 127
6.1 功能描述 128
6.2 理論基礎 128
6.2.1 第三方消息推送平臺 128
6.2.2 AppKey申請 128
6.2.3 導入SDK開發包 129
6.2.4 配置 AndroidManifest.xml 130
6.2.5 SQLite 132
6.2.6 BaseAdapter的應用 133
6.3 總體設計 134
6.3.1 數據庫設計 134
6.3.2 消息處理 134
6.3.3 消息管理 134
6.4 代碼實現 135
6.4.1 數據庫設計 135
6.4.2 消息處理 135
6.4.3 消息管理 138
6.5 程序的運行與發布 149
6.5.1 運行程序 149
6.5.2 發布程序 152
第7章 基于多線程的端口掃描器 153
7.1 功能描述 154
7.2 理論基礎 154
7.2.1 布局管理器
(LayoutManager) 154
7.2.2 多線程 157
7.2.3 端口掃描 161
7.3 總體設計 162
7.4 代碼實現 163
7.4.1 TCPThread.java 163
7.4.2 ThreadScan.java 167
7.4.3 AboutDialog.java 178
7.5 程序的運行與發布 179
7.5.1 運行程序 179
7.5.2 發布程序 181
第8章 Java聊天室 183
8.1 功能描述 184
8.2 理論基礎 184
8.2.1 套接字通信 184
8.2.2 套接字客戶端 185
8.2.3 套接字服務端 186
8.2.4 數據報通信 186
8.2.5 URL與URLConnection 187
8.2.6 Java鏈表的實現 189
8.3 總體設計 190
8.3.1 聊天室服務器端的設計 190
8.3.2 聊天室客戶端設計 191
8.4 代碼實現 191
8.4.1 聊天室服務器端代碼的
實現 191
8.4.2 聊天室客戶端代碼的實現 211
8.5 程序的運行與發布 228
8.5.1 聊天室服務器端程序的
運行 228
8.5.2 聊天室服務器端程序的
發布 230
8.5.3 聊天室客戶端程序的運行 231
8.5.4 聊天室客戶端程序的發布 232
第9章 中國象棋對弈系統 233
9.1 功能描述 234
9.2 理論基礎 234
9.2.1 中國象棋簡介 234
9.2.2 中國象棋走子規則 234
9.2.3 中國象棋吃子規則 234
9.3 總體設計 235
9.4 代碼實現 235
9.4.1 引用類包及類的定義 235
9.4.2 圖形用戶界面模塊 236
9.4.3 按鈕的操作模塊 240
9.4.4 棋子的操作模塊 243
9.4.5 棋子的移動規則類模塊 250
9.5 程序的運行與發布 280
9.5.1 運行程序 280
9.5.2 發布程序 282
第10章 資產管理系統 283
10.1 需求分析 284
10.2 系統設計 284
10.2.1 結構設計 284
10.2.2 功能結構 285
10.2.3 功能流程及工作流描述 285
10.3 數據庫設計 287
10.4 詳細設計 288
10.4.1 資產管理系統主界面模塊 288
10.4.2 系統管理模塊 295
10.4.3 資產信息管理模塊 302
11.4.4 人員信息管理模塊 319
11.4.5 資產操作管理模塊 335
11.4.6 信息查詢模塊 355
11.4.7 數據庫操作模塊 363
10.5 程序的運行與發布 395
10.5.1 配置數據源 395
10.5.2 運行程序 397
10.5.3 發布程序 397
第11章 人事管理系統 399
11.1 需求分析 400
11.2 系統設計 401
11.2.1 結構設計 401
11.2.2 功能結構 401
11.2.3 功能流程及工作流描述 401
11.3 數據庫設計 403
11.4 詳細設計 404
11.4.1 人事管理系統主界面模塊 404
11.4.2 基礎信息管理模塊 410
11.4.3 人員調動管理模塊 435
11.4.4 人員考核管理模塊 443
11.4.5 勞資管理模塊 450
11.4.6 數據庫操作模塊 458
11.5 程序的運行與發布 483
11.5.1 配置數據源 483
11.5.2 運行程序 484
11.5.3 發布程序 484
參考文獻 486
第2章 Java程序設計基礎
本章主要介紹基本數據類型、運算符、控制語句、字符串及數組等Java程序設計所要掌握的基礎知識。基本數據類型部分主要介紹Java中的數據類型、標識符與關鍵字、常量與變量等內容;運算符與表達式部分主要介紹算術運算符、位運算符、布爾運算符、賦值運算符、關系運算符、條件運算符及它們的優先級;控制語句部分主要介紹選擇結構、循環結構及跳轉結構所使用的各種語句及其特性;字符串部分主要介紹String類與StringBuffer類的使用方法與注意事項;最后介紹數組概念及一維數組、多維數組及對象數組的定義與使用。
2.1 Java的基本數據類型
數據類型是程序設計中最基本的概念。Java語言中的數據類型非常豐富,所有變量都必須屬于某一個數據類型。不同的數據類型所存儲的值的種類,以及可能進行的操作方式都是不同的。本節主要講解Java的基本數據類型,常量、變量的基本概念,以及變量的定義方法。
2.1.1 數據類型
Java的數據類型可以分為兩大類:基本數據類型與復合數據類型。其中,基本數據類型包括整型、浮點型、布爾型和字符型;復合數據類型包括數組、接口和類,如圖2.1所示。
圖2.1 Java的數據類型
2.1.2 標識符與關鍵字
在程序設計語言中,用來標識成分(如類、對象、變量、常量、方法和參數名稱等)存在與唯一性的名字,稱為標識符。標識符是由字母、下劃線或美元符號$開頭,后接若干任意字符的字符串。在程序設計中,程序設計者可以根據需要,自由地確定簡單且易于理解的標識符,但同時也應該遵循一定的語法規則。
Java對標識符定義的規定如下。
* 標識符可以由字母、數字、下劃線(_)或美元符號($)組成。
* 標識符必須以字母、下劃線(_)或美元符號($)開頭。
* 標識符的長度不限,但在實際應用中不宜過長。
* Java語言中的標識符區分大小寫,例如Myworld與myworld是不同的。
* 標識符不能與關鍵字(保留字)同名。
下面舉例說明。
合法標識符:xyz、_xyz、$xyz。
非法標識符:5xyz(首字符不能為數字)、Xyz@(含有非法字符)、if(關鍵字)。
在Java語言中,有一部分標識符被確定為關鍵字(保留字),因為在程序設計中,該部分標識符已經被使用或者被賦予特定意義。表2.1為Java語言中的關鍵字。
2.1.3 常量
常量是指在程序運行過程中固定不變的量。常量共包含以下6類。
1.整型常量
整型常量包括4種類型:int、long、short、byte。4種類型的取值范圍如表2.2所示。
整數類型的文字可使用十進制、八進制和十六進制表示。首位為"0"表示八進制的數值;首位為"0x"表示十六進制的數值。請看下面的例子:
8 表示十進制值8
075 表示八進制數值75(也就是十進制數61)
0x9ABC 表示十六進制的數值9ABC(也就是十進制數39612)
整數默認為int類型,如在其后有一個字母"L"則表示一個long值(也可以用小寫字母"l")。由于小寫字母"l"與數字"1"容易混淆,因而,建議大家采用大寫字母"L"。
上面所說的整數long的形式如下:
8L 表示十進制值8,是一個long值
075L 表示八進制數值75,是一個long值
0x9ABCL 表示十六進制的數值9ABC,是一個long值
2.浮點型常量
為了提高計算的準確性,由此引入了浮點型數據。浮點型數據包括兩種:單精度和雙精度,取值范圍如表2.3所示。
表2.3 浮點型數據的取值范圍
數據類型
所占字節
表示范圍
float(單精度)
4
-3.4E38~3.4E38
double(雙精度)
8
-1.7E308~1.7E308
如果不明確指明浮點數的類型,浮點數默認為double。下面是幾個浮點數:
3.14159 (double型浮點數)
2.08E25 (double型浮點數)
6.56f (float型浮點數)
在兩種類型的浮點數中,double類型的浮點數具有更高的精度。
3.字符型常量
字符型常量是由一對單引號包含起來的單個字符,例如'a','2'。Java中的字符型數據是16位無符號型數據,它表示Unicode集,而不僅僅是ASCII集。
與C語言類似,Java也提供轉義字符,以反斜杠(\)開頭,將其后的字符轉變為另外的含義。表2.4列出了Java中的轉義字符。
4.字符串型常量
字符串型常量是由一對雙引號包含的,由0個或多個字符組成的一個字符序列。
5.布爾型常量
布爾型常量只能取值為true和false,其中true表示邏輯真,false表示邏輯假。
6.null常量
null常量只有一個值,用null表示為空。
2.1.4 變量
變量就是在程序運行過程中值可以變化的量。變量名是用戶為變量定義的標識符,變量的值存儲在系統為變量分配的存儲單元中。Java變量的類型包括:整型變量、浮點型變量、布爾型變量、字符型變量、字符串型變量、數組變量、對象(引用)變量等。
1.變量的定義
在Java程序設計過程中,變量需要先定義后使用。定義變量的時候需要確定變量的類型和變量的標識符。
聲明Java變量的語法格式如下:
type var1[,ver2][,...]
type var1[=init1][,var2[=init2],...]
其中,type為變量類型名,var為變量名,init為初始值,方括號中的內容為可選項。例如:
int a = 1, b, c; //定義整型變量a、b、c,并為a賦初值1
float f = 1.12f; //定義單精度浮點型變量f,并賦初值
double d = 32.34; //定義雙精度浮點型變量d,并賦初值
char char1 = 'c'; //定義字符型變量char1,并賦初值
String s = "abc"; //定義字符串型變量s,并賦初值
boolean b = true; //定義布爾型變量b,并賦初值
2.變量基本數據類型的轉換
在Java程序中,將一種數據類型的常數或變量轉換為另外一種數據類型,稱為類型轉換。當多種數據類型的數據混合運算時,不同類型的數據必須先轉化為同一種數據類型。類型轉換有兩種:自動類型轉換(或稱隱含類型轉換)和強制類型轉換。
1) 自動類型轉換
自動類型轉換遵循的規則是把低精度類型轉換為高精度類型。當把占用位數較短的數據轉化成占用位數較長的數據時,Java執行自動類型轉換,不需要在程序中做出特別的 說明。
例如,下面的語句把int型數據賦值給long型數據,在編譯時不會發生任何錯誤:
int i = 10;
long j = i;
假若對主數據類型執行任何算術運算或按位運算,在正式執行運算之前,"比int小"的數據(char、byte、short)會自動轉換成int,這樣一來,最終生成的值就是int類型。
整型、實型、字符型數據同樣可以混合運算。運算中,不同類型的數據先轉化為同一種類型,然后進行運算,轉換遵循從低級到高級的原則。通常,表達式中最大的數據類型是決定了表達式最終結果大小的那個類型。例如:若將一個float值與一個double值相乘,結果就是double值;如將一個int值和一個long值相加,則結果為long值。
2) 強制類型轉換
當兩種類型彼此不兼容,或者目標類型的取值范圍小于源類型時,就必須進行強制類型轉換。強制類型轉換的語法如下:
目標類型 變量 = (目標類型)值
經過強制類型轉換,將得到一個在"()"中聲明的數據類型的數據,該數據是從指定變量所包含的數據轉換而來的。例如:
int x,y;//定義int型變量x,y
byte z;//定義byte型變量z
//強制類型轉換
x = (int)22.11 + (int)11.22;
y = (int)'a' + (int)'b';
z = (byte)(x+y);
3.變量的作用域
變量的作用域是指可訪問該變量的代碼域。聲明一個變量的同時也就指明了變量的作用域。按作用域來分,變量可以有下面幾種:局部變量、類變量、方法參數、例外處理參數。局部變量在方法或方法的部分代碼中聲明,其作用域為它所在的代碼塊(整個方法或方法中的某塊代碼)。
Java語言用大括號將若干語句組成語句塊,變量的有效范圍是聲明它的語句所在的語句塊,一旦程序的執行離開了這個語句塊,將無法繼續調用其中的變量。例如:
if (...) {
int i = 25;
...
}
System.out.println("The value of i = " + i); // 錯誤
最后一行無法進行匯編是因為變量i已經超出了作用域。i的作用域是"{"和"}"之間的代碼塊。在該代碼塊外,變量i就不存在了,所以無法調用。改正的方法是可以將變量的聲明移到if語句塊的外面,或者是將println方法調用移動到if語句塊中。
2.2 Java運算符與表達式
2.2.1 算術運算符
算術運算符分為單目運算符和雙目運算符,具體運算符如表2.5所示。
在算術運算中,有以下值得注意的地方。
* 算術運算符的總體原則是先乘除、再加減,括號優先。
* 整數除法會直接砍掉小數,而不是進位。
* 取模運算符的操作數可以為浮點數。如:37.2%10=7.2。這點與C語言不同。
* Java也可用一種簡寫形式進行運算,并同時進行賦值操作。例如,為了將10與變量x相加,并將結果賦給x,可用x+=10。
* Java對加運算符進行了擴展,使它能夠進行字符串的連接,如"abc"+"def",得到串"abcdef"。
* 前綴++、--與后綴++、--的區別如下。
* ++i(前綴++)在使用i之前,使i的值加1,因此執行完++i后,整個表達式和i的值均為i+1;i++(后綴++)在使用i之后,使i的值加1,因此執行完i++后,整個表達式的值為i,而i的值變為i+1。
* --i(前綴--)在使用i之前,使i的值減1,因此執行完--i后,整個表達式和i的值均為i-1;i--(后綴--)在使用i之后,使i的值減1,因此執行完i--后,整個表達式的值為i,而i的值變為i-1。