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