本書從Java語言的基本特點(diǎn)入手, 全面介紹Java語言的基本概念和編程方法, 并深入介紹Java語言的高級特性。書中內(nèi)容涉及Java語言中的基本語法、數(shù)據(jù)類型、類、異常、界面設(shè)計、小應(yīng)用程序、I/O數(shù)據(jù)流、線程及網(wǎng)絡(luò)功能等, 基本覆蓋了Java語言的大部分實用技術(shù), 是進(jìn)一步使用Java語言進(jìn)行技術(shù)開發(fā)的基礎(chǔ)!禞ava程序設(shè)計》內(nèi)容詳盡, 實例豐富, 在每章最后均列出了若干習(xí)題, 以方便教學(xué)。
辛運(yùn)幃,女,博士,教授,F(xiàn)為南開大學(xué)計算機(jī)與控制工程學(xué)院計算機(jī)與信息安全系教授。多年來一直從事程序語言設(shè)計、數(shù)據(jù)結(jié)構(gòu)與算法等方向的教學(xué)和科研工作,主講數(shù)據(jù)結(jié)構(gòu)與算法、形式語言與自動機(jī)、計算方法等課程。主要研究領(lǐng)域為人工智能、電子商務(wù)、加密技術(shù)、智能信息系統(tǒng)等,已出版《Java語言程序設(shè)計》、《數(shù)據(jù)結(jié)構(gòu)》、《離散數(shù)學(xué)》等相關(guān)教材。
概述
1.1 什么是Java語言 1
1.1.1 Java語言的特點(diǎn) 1
1.1.2 Java的三層架構(gòu) 3
1.1.3 Java語言的目標(biāo) 4
1.1.4 Java虛擬機(jī) 4
1.1.5 垃圾收集 5
1.1.6 代碼安全 5
1.2 一個基本的Java應(yīng)用程序 8
1.2.1 開發(fā)環(huán)境的安裝 8
1.2.2 Java應(yīng)用程序 11
1.3 程序的編譯和運(yùn)行 13
1.3.1 編譯 13
1.3.2 運(yùn)行 13
1.4 常見錯誤 14
1.4.1 編譯時錯誤 14
1.4.2 運(yùn)行時錯誤 15
1.5 使用Java核心API文檔 16
習(xí)題 19
標(biāo)識符和數(shù)據(jù)類型
2.1 Java的基本語法單位 20
2.1.1 空白、注釋及語句 20
2.1.2 關(guān)鍵字 22
2.1.3 標(biāo)識符 23
2.2 Java編碼體例 23
2.3 Java的基本數(shù)據(jù)類型 24
2.3.1 基本數(shù)據(jù)類型 24
2.3.2 類型轉(zhuǎn)換 27
2.3.3 變量、說明和賦值 27
2.4 復(fù)合數(shù)據(jù)類型 29
2.4.1 概述 29
2.4.2 復(fù)合數(shù)據(jù)類型 30
2.5 類和對象的初步介紹 30
2.5.1 Java中的面向?qū)ο蠹夹g(shù) 30
2.5.2 Java中的類定義 32
2.5.3 Java中與OOP有關(guān)的關(guān)鍵字 33
2.5.4 類定義示例 36
2.5.5 創(chuàng)建一個對象 38
2.5.6 引用變量的賦值 41
2.5.7 默認(rèn)初始化和null引用值 41
2.5.8 術(shù)語概述 42
習(xí)題 43
表達(dá)式和流程控制語句
3.1 表達(dá)式 45
3.1.1 操作數(shù) 45
3.1.2 運(yùn)算符 49
3.1.3 表達(dá)式的提升和轉(zhuǎn)換 53
3.1.4 數(shù)學(xué)函數(shù) 53
3.2 流控制 54
3.2.1 表達(dá)式語句 54
3.2.2 塊 55
3.2.3 分支語句 55
3.2.4 循環(huán)語句 61
3.2.5 break與continue語句 63
3.2.6 注釋語句 65
3.3 簡單的輸入輸出 66
習(xí)題 69
數(shù)組、向量和字符串
4.1 數(shù)組 72
4.1.1 數(shù)組說明 72
4.1.2 創(chuàng)建數(shù)組 73
4.1.3 數(shù)組邊界 76
4.1.4 數(shù)組元素的引用 76
4.1.5 多維數(shù)組 78
4.1.6 數(shù)組復(fù)制 83
4.2 Vector類 83
4.2.1 概述 84
4.2.2 Vector類的構(gòu)造方法 84
4.2.3 Vector類對象的操作 85
4.2.4 Vector類中的其他方法 87
4.2.5 Vector類的使用舉例 87
4.3 字符串類型 89
4.3.1 字符串簡述 89
4.3.2 字符串說明及初始化 89
4.3.3 字符串處理 90
4.3.4 幾個特殊處理 91
習(xí)題 93
進(jìn)一步討論對象和類
5.1 抽象數(shù)據(jù)類型 96
5.1.1 概述 96
5.1.2 定義方法 97
5.1.3 按值傳送 100
5.1.4 重載方法名 102
5.2 對象的構(gòu)造和初始化 103
5.2.1 顯式成員初始化 103
5.2.2 構(gòu)造方法 103
5.2.3 默認(rèn)的構(gòu)造方法 105
5.2.4 構(gòu)造方法重載 106
5.2.5 finalize()方法 106
5.2.6 this引用 107
5.3 子類 107
5.3.1 is-a關(guān)系 108
5.3.2 extends關(guān)鍵字 109
5.3.3 單重繼承 110
5.3.4 轉(zhuǎn)換對象 112
5.3.5 方法自變量和異類集合 114
5.4 方法重寫 115
5.4.1 方法重寫示例 115
5.4.2 應(yīng)用重寫的規(guī)則 119
5.4.3 父類構(gòu)造方法調(diào)用 120
5.5 多態(tài) 121
5.6 Java包 122
5.6.1 Java包的概念 123
5.6.2 import語句 123
5.6.3 目錄層次關(guān)系及CLASSPATH環(huán)境變量 125
5.6.4 訪問權(quán)限與數(shù)據(jù)隱藏 126
5.6.5 封裝 128
5.7 類成員 128
5.7.1 類變量 128
5.7.2 類方法 131
5.8 關(guān)鍵字final 132
5.8.1 終極類 133
5.8.2 終極方法 133
5.8.3 終極變量 134
5.9 抽象類 135
5.10 接口 137
5.10.1 接口的定義 138
5.10.2 接口的實現(xiàn) 138
5.11 內(nèi)部類 142
5.11.1 內(nèi)部類的概念 142
5.11.2 匿名類 144
5.11.3 內(nèi)部類的工作方式 145
5.12 包裝類 145
習(xí)題 147
Java語言中的異常
6.1 異常 149
6.1.1 引出異常 149
6.1.2 異常的概念 151
6.1.3 異常分類 152
6.2 異常處理 154
6.2.1 try-catch塊 154
6.2.2 再討論前面的示例 157
6.2.3 公共異常 157
6.3 拋出異常 159
6.4 創(chuàng)建自己的異常 160
習(xí)題 162
Java語言的高級特性
7.1 泛型 163
7.1.1 泛型數(shù)據(jù)類型 163
7.1.2 接口中的泛型 163
7.1.3 泛型類 164
7.1.4 泛型方法 166
7.2 迭代器 167
7.2.1 迭代器的基本概念 167
7.2.2 接口Iterator 167
7.2.3 接口Iterable 169
7.2.4 使用迭代器示例 169
7.2.5 Iterable和for-each循環(huán) 173
7.3 克隆 173
習(xí)題 181
Java的圖形用戶界面設(shè)計
第5章 進(jìn)一步討論對象和類
5.1 抽象數(shù)據(jù)類型
5.1.1 概述
絕大多數(shù)程序設(shè)計語言都預(yù)定義了一些基本數(shù)據(jù)類型,并相應(yīng)定義了對那些類型的實例執(zhí)行的操作。比如,對整型、實型等數(shù)值類型,有加、減、乘、除等操作;對邏輯類型,有邏輯與、邏輯或、邏輯非等操作。
對于用戶自定義的復(fù)合數(shù)據(jù)類型,需要由程序員自己定義一些方法,對該類型的實例進(jìn)行所需的操作。在早期許多程序設(shè)計語言中,復(fù)合數(shù)據(jù)類型及其相關(guān)操作的代碼之間沒有特殊的聯(lián)系。比如,用戶定義日期Date類型,并定義一個方法tomorrow(),它接收一個Date類型的參數(shù),據(jù)此推斷其后繼日是哪一天。程序中定義變量的代碼和tomorrow()方法的代碼可以是分離的。
有些編程語言改進(jìn)了這種處理方式,允許數(shù)據(jù)類型說明和欲對該類型變量進(jìn)行操作的代碼說明之間有較緊密的聯(lián)系。通常數(shù)據(jù)類型加上其上的操作稱為抽象數(shù)據(jù)類型。嚴(yán)格地說,抽象數(shù)據(jù)類型是指基于一個邏輯類型的數(shù)據(jù)類型以及這個類型上的一組操作。每一個操作由它的輸入、輸出定義。一個抽象數(shù)據(jù)類型的定義并不涉及它的實現(xiàn)細(xì)節(jié),這些實現(xiàn)細(xì)節(jié)對于抽象數(shù)據(jù)類型的用戶是隱藏的。
程序5-1給出了Date類型和tomorrow操作間建立的一種聯(lián)系。
程序5-1
public class Date {
private int day, month, year;
Date ( int i, int j, int k) {
?day = i;
?month = j;
?year = k;
}
Date() { //這是個構(gòu)造方法,顯式初始化
?day = 1;
?month = 1;
?year = 1998;
}
Date ( Date d) { //這是帶一個參數(shù)的構(gòu)造方法
?day = d.day;
?month = d.month;
?year = d.year;
}
public Date tomorrow() {
?Date d = new Date(this); //說明一個對象
?d.day++;
?if (d.day > d.daysInMonth()){//daysInMonth()返回每個月中不同的天數(shù)
d.day = 1;
d.month ++;
if (d.month > 12) {
d.month = 1;
d.year ++;
}
}
return d;
}
}
名為tomorrow的代碼段在Java中叫作方法,也可以稱為成員函數(shù)。
在有些程序設(shè)計語言中,tomorrow()方法的定義或許會要求帶一個參數(shù),例如:
void tomorrow(Date d);
像Java這種支持抽象數(shù)據(jù)類型的語言在數(shù)據(jù)和操作間建立了較嚴(yán)格的聯(lián)系,即把方法與數(shù)據(jù)封裝在一個類中。在程序中不是把方法描述為對數(shù)據(jù)的操作,而是認(rèn)為數(shù)據(jù)知道如何修改自己,然后要求數(shù)據(jù)對它自己執(zhí)行操作。相應(yīng)的語句如下:
Data d = new Date ( 20, 11, 1998); //已初始化的date對象
d.tomorrow();
這種寫法表明,數(shù)據(jù)自己執(zhí)行操作,tomorrow()方法作用于變量d。要訪問Date類的域,可使用點(diǎn)操作符“.”:
d.day
它的意思是“d所指的Date對象中的day域”。類似地,d.tomorrow()是指“調(diào)用d所指的Date對象中的tomorrow()方法”,即對d對象進(jìn)行tomorrow操作。
把方法看作是數(shù)據(jù)的特性,而不把數(shù)據(jù)與方法分開,這種思想是建立面向?qū)ο笙到y(tǒng)過程中的重要步驟。
5.1.2 定義方法
定義一個抽象數(shù)據(jù)類型后,還需要為這個類型的對象定義相應(yīng)的操作,也就是方法。在Java中,方法的定義方式類似于其他語言,尤其與C和C++ 很類似。定義的一般格式如下:
<修飾符> <返回類型> <名字>(<參數(shù)列表>)<塊>
其中:
* <名字>是方法名,它必須使用合法的標(biāo)識符。
* <返回類型>說明方法返回值的類型。如果方法不返回任何值,它應(yīng)該聲明為void。Java對待返回值的要求很嚴(yán)格,方法返回值必須與所說明的類型相匹配。如果方法說明有返回值,比如說是int,那么方法從任何一個分支返回時都必須返回一個整數(shù)值。
* <修飾符>段可以含幾個不同的修飾符,其中限定訪問權(quán)限的修飾符包括public、protected和private。public訪問修飾符表示該方法可以被任何其他代碼調(diào)用,而private表示方法只能被類中的其他方法調(diào)用。關(guān)于其他修飾符的說明請參考 2.5.3節(jié)。
* <參數(shù)列表>是傳送給方法的參數(shù)表。表中各元素間以逗號分隔,每個元素由一個類型和一個標(biāo)識符組成。
* <塊>表示方法體,是要實際執(zhí)行的代碼段。
在例5-1中,為程序2-4中的Customer類定義了方法setName()和setAddress()。
例5-1 方法定義示例。
void setName (String name) {
this.name = name;
}
String getAddress() {
return address;
}
下面在Date類中增加daysInMonth()和printDate()方法,以便完善Date類。
程序5-2
public class Date {
private int day, month, year;
Date ( int i, int j, int k) {
day = i;
month = j;
year = k;
}
Date() { //構(gòu)造方法
day = 1;
month = 1;
year = 1998;
}
Date ( Date d) { //帶一個參數(shù)的構(gòu)造方法
day = d.day;
month = d.month;
year = d.year;
}
public void printDate() {
System.out.print(day + "/" + month + "/" + year);
}
public Date tomorrow() {
Date d = new Date(this);
d.day++;
if (d.day > d.daysInMonth()) {
d.day = 1;
d.month ++;
if (d.month > 12) {
d.month = 1;
d.year ++;
}
}
return d;
}
public int daysInMonth() {
switch (month) {
case 1: case 3: case 5: case 7:
case 8: case 10: case 12:
return 31;
case 4: case 6: case 9: case 11:
return 30;
default:
if ( year % 100 != 0 && year % 4 == 0 ) {
return 29;
}
else return 28;
……