本書從Java語言的基本特點入手, 全面介紹Java語言的基本概念和編程方法, 并深入介紹Java語言的高級特性。書中內(nèi)容涉及Java語言中的基本語法、數(shù)據(jù)類型、類、異常、界面設計、小應用程序、I/O數(shù)據(jù)流、線程及網(wǎng)絡功能等, 基本覆蓋了Java語言的大部分實用技術, 是進一步使用Java語言進行技術開發(fā)的基礎!禞ava程序設計》內(nèi)容詳盡, 實例豐富, 在每章最后均列出了若干習題, 以方便教學。
辛運幃,女,博士,教授,F(xiàn)為南開大學計算機與控制工程學院計算機與信息安全系教授。多年來一直從事程序語言設計、數(shù)據(jù)結構與算法等方向的教學和科研工作,主講數(shù)據(jù)結構與算法、形式語言與自動機、計算方法等課程。主要研究領域為人工智能、電子商務、加密技術、智能信息系統(tǒng)等,已出版《Java語言程序設計》、《數(shù)據(jù)結構》、《離散數(shù)學》等相關教材。
概述
1.1 什么是Java語言 1
1.1.1 Java語言的特點 1
1.1.2 Java的三層架構 3
1.1.3 Java語言的目標 4
1.1.4 Java虛擬機 4
1.1.5 垃圾收集 5
1.1.6 代碼安全 5
1.2 一個基本的Java應用程序 8
1.2.1 開發(fā)環(huán)境的安裝 8
1.2.2 Java應用程序 11
1.3 程序的編譯和運行 13
1.3.1 編譯 13
1.3.2 運行 13
1.4 常見錯誤 14
1.4.1 編譯時錯誤 14
1.4.2 運行時錯誤 15
1.5 使用Java核心API文檔 16
習題 19
標識符和數(shù)據(jù)類型
2.1 Java的基本語法單位 20
2.1.1 空白、注釋及語句 20
2.1.2 關鍵字 22
2.1.3 標識符 23
2.2 Java編碼體例 23
2.3 Java的基本數(shù)據(jù)類型 24
2.3.1 基本數(shù)據(jù)類型 24
2.3.2 類型轉換 27
2.3.3 變量、說明和賦值 27
2.4 復合數(shù)據(jù)類型 29
2.4.1 概述 29
2.4.2 復合數(shù)據(jù)類型 30
2.5 類和對象的初步介紹 30
2.5.1 Java中的面向對象技術 30
2.5.2 Java中的類定義 32
2.5.3 Java中與OOP有關的關鍵字 33
2.5.4 類定義示例 36
2.5.5 創(chuàng)建一個對象 38
2.5.6 引用變量的賦值 41
2.5.7 默認初始化和null引用值 41
2.5.8 術語概述 42
習題 43
表達式和流程控制語句
3.1 表達式 45
3.1.1 操作數(shù) 45
3.1.2 運算符 49
3.1.3 表達式的提升和轉換 53
3.1.4 數(shù)學函數(shù) 53
3.2 流控制 54
3.2.1 表達式語句 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
習題 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ù)組復制 83
4.2 Vector類 83
4.2.1 概述 84
4.2.2 Vector類的構造方法 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
習題 93
進一步討論對象和類
5.1 抽象數(shù)據(jù)類型 96
5.1.1 概述 96
5.1.2 定義方法 97
5.1.3 按值傳送 100
5.1.4 重載方法名 102
5.2 對象的構造和初始化 103
5.2.1 顯式成員初始化 103
5.2.2 構造方法 103
5.2.3 默認的構造方法 105
5.2.4 構造方法重載 106
5.2.5 finalize()方法 106
5.2.6 this引用 107
5.3 子類 107
5.3.1 is-a關系 108
5.3.2 extends關鍵字 109
5.3.3 單重繼承 110
5.3.4 轉換對象 112
5.3.5 方法自變量和異類集合 114
5.4 方法重寫 115
5.4.1 方法重寫示例 115
5.4.2 應用重寫的規(guī)則 119
5.4.3 父類構造方法調(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 目錄層次關系及CLASSPATH環(huán)境變量 125
5.6.4 訪問權限與數(shù)據(jù)隱藏 126
5.6.5 封裝 128
5.7 類成員 128
5.7.1 類變量 128
5.7.2 類方法 131
5.8 關鍵字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
習題 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
習題 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
習題 181
Java的圖形用戶界面設計
第5章 進一步討論對象和類
5.1 抽象數(shù)據(jù)類型
5.1.1 概述
絕大多數(shù)程序設計語言都預定義了一些基本數(shù)據(jù)類型,并相應定義了對那些類型的實例執(zhí)行的操作。比如,對整型、實型等數(shù)值類型,有加、減、乘、除等操作;對邏輯類型,有邏輯與、邏輯或、邏輯非等操作。
對于用戶自定義的復合數(shù)據(jù)類型,需要由程序員自己定義一些方法,對該類型的實例進行所需的操作。在早期許多程序設計語言中,復合數(shù)據(jù)類型及其相關操作的代碼之間沒有特殊的聯(lián)系。比如,用戶定義日期Date類型,并定義一個方法tomorrow(),它接收一個Date類型的參數(shù),據(jù)此推斷其后繼日是哪一天。程序中定義變量的代碼和tomorrow()方法的代碼可以是分離的。
有些編程語言改進了這種處理方式,允許數(shù)據(jù)類型說明和欲對該類型變量進行操作的代碼說明之間有較緊密的聯(lián)系。通常數(shù)據(jù)類型加上其上的操作稱為抽象數(shù)據(jù)類型。嚴格地說,抽象數(shù)據(jù)類型是指基于一個邏輯類型的數(shù)據(jù)類型以及這個類型上的一組操作。每一個操作由它的輸入、輸出定義。一個抽象數(shù)據(jù)類型的定義并不涉及它的實現(xiàn)細節(jié),這些實現(xiàn)細節(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() { //這是個構造方法,顯式初始化
?day = 1;
?month = 1;
?year = 1998;
}
Date ( Date d) { //這是帶一個參數(shù)的構造方法
?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ù)。
在有些程序設計語言中,tomorrow()方法的定義或許會要求帶一個參數(shù),例如:
void tomorrow(Date d);
像Java這種支持抽象數(shù)據(jù)類型的語言在數(shù)據(jù)和操作間建立了較嚴格的聯(lián)系,即把方法與數(shù)據(jù)封裝在一個類中。在程序中不是把方法描述為對數(shù)據(jù)的操作,而是認為數(shù)據(jù)知道如何修改自己,然后要求數(shù)據(jù)對它自己執(zhí)行操作。相應的語句如下:
Data d = new Date ( 20, 11, 1998); //已初始化的date對象
d.tomorrow();
這種寫法表明,數(shù)據(jù)自己執(zhí)行操作,tomorrow()方法作用于變量d。要訪問Date類的域,可使用點操作符“.”:
d.day
它的意思是“d所指的Date對象中的day域”。類似地,d.tomorrow()是指“調(diào)用d所指的Date對象中的tomorrow()方法”,即對d對象進行tomorrow操作。
把方法看作是數(shù)據(jù)的特性,而不把數(shù)據(jù)與方法分開,這種思想是建立面向對象系統(tǒng)過程中的重要步驟。
5.1.2 定義方法
定義一個抽象數(shù)據(jù)類型后,還需要為這個類型的對象定義相應的操作,也就是方法。在Java中,方法的定義方式類似于其他語言,尤其與C和C++ 很類似。定義的一般格式如下:
<修飾符> <返回類型> <名字>(<參數(shù)列表>)<塊>
其中:
* <名字>是方法名,它必須使用合法的標識符。
* <返回類型>說明方法返回值的類型。如果方法不返回任何值,它應該聲明為void。Java對待返回值的要求很嚴格,方法返回值必須與所說明的類型相匹配。如果方法說明有返回值,比如說是int,那么方法從任何一個分支返回時都必須返回一個整數(shù)值。
* <修飾符>段可以含幾個不同的修飾符,其中限定訪問權限的修飾符包括public、protected和private。public訪問修飾符表示該方法可以被任何其他代碼調(diào)用,而private表示方法只能被類中的其他方法調(diào)用。關于其他修飾符的說明請參考 2.5.3節(jié)。
* <參數(shù)列表>是傳送給方法的參數(shù)表。表中各元素間以逗號分隔,每個元素由一個類型和一個標識符組成。
* <塊>表示方法體,是要實際執(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() { //構造方法
day = 1;
month = 1;
year = 1998;
}
Date ( Date d) { //帶一個參數(shù)的構造方法
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;
……