編輯推薦
本書是Java語言的入門級教材,是作者針對Java語言的教學目的,結閤國內教學的特點,根據多年的教學實踐與科技開發的經驗編寫的。結閤作者編寫的《Java程序設計題解與上機指導》,能幫助讀者盡快掌握Java程序設計的方法。
內容簡介
本書從Java語言的基本特點入手,全麵介紹瞭Java語言的基本概念和編程方法,並深入介紹瞭Java語言的高級特性。內容涉及Java語言的基本語法、數據類型、類、異常、界麵設計、小應用程序、I/O數據流、綫程及網絡功能等,基本覆蓋瞭Java語言的大部分技術,是進一步使用Java語言進行技術開發的基礎。
本書內容詳盡,實例豐富,在每章最後均列齣瞭若乾習題,以方便教學。
與本書配套的《Java程序設計題解與上機指導》(第四版)中提供瞭本書的習題解答及有關上機 實驗。
本書適閤作為高等學校教材,也可作為專業人員的參考書。
作者簡介
辛運幃,女,博士,教授。現為南開大學計算機與控製工程學院計算機與信息安全係教授。多年來一直從事程序語言設計、數據結構與算法等方嚮的教學和科研工作,主講數據結構與算法、形式語言與自動機、計算方法等課程。主要研究領域為人工智能、電子商務、加密技術、智能信息係統等,已齣版《Java語言程序設計》、《數據結構》、《離散數學》等相關教材。
目錄
概述
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 開發環境的安裝 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
標識符和數據類型
2.1 Java的基本語法單位 20
2.1.1 空白、注釋及語句 20
2.1.2 關鍵字 22
2.1.3 標識符 23
2.2 Java編碼體例 23
2.3 Java的基本數據類型 24
2.3.1 基本數據類型 24
2.3.2 類型轉換 27
2.3.3 變量、說明和賦值 27
2.4 復閤數據類型 29
2.4.1 概述 29
2.4.2 復閤數據類型 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 創建一個對象 38
2.5.6 引用變量的賦值 41
2.5.7 默認初始化和null引用值 41
2.5.8 術語概述 42
習題 43
錶達式和流程控製語句
3.1 錶達式 45
3.1.1 操作數 45
3.1.2 運算符 49
3.1.3 錶達式的提升和轉換 53
3.1.4 數學函數 53
3.2 流控製 54
3.2.1 錶達式語句 54
3.2.2 塊 55
3.2.3 分支語句 55
3.2.4 循環語句 61
3.2.5 break與continue語句 63
3.2.6 注釋語句 65
3.3 簡單的輸入輸齣 66
習題 69
數組、嚮量和字符串
4.1 數組 72
4.1.1 數組說明 72
4.1.2 創建數組 73
4.1.3 數組邊界 76
4.1.4 數組元素的引用 76
4.1.5 多維數組 78
4.1.6 數組復製 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 抽象數據類型 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 應用重寫的規則 119
5.4.3 父類構造方法調用 120
5.5 多態 121
5.6 Java包 122
5.6.1 Java包的概念 123
5.6.2 import語句 123
5.6.3 目錄層次關係及CLASSPATH環境變量 125
5.6.4 訪問權限與數據隱藏 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 接口的實現 138
5.11 內部類 142
5.11.1 內部類的概念 142
5.11.2 匿名類 144
5.11.3 內部類的工作方式 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 創建自己的異常 160
習題 162
Java語言的高級特性
7.1 泛型 163
7.1.1 泛型數據類型 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循環 173
7.3 剋隆 173
習題 181
Java的圖形用戶界麵設計
精彩書摘
第5章 進一步討論對象和類
5.1 抽象數據類型
5.1.1 概述
絕大多數程序設計語言都預定義瞭一些基本數據類型,並相應定義瞭對那些類型的實例執行的操作。比如,對整型、實型等數值類型,有加、減、乘、除等操作;對邏輯類型,有邏輯與、邏輯或、邏輯非等操作。
對於用戶自定義的復閤數據類型,需要由程序員自己定義一些方法,對該類型的實例進行所需的操作。在早期許多程序設計語言中,復閤數據類型及其相關操作的代碼之間沒有特殊的聯係。比如,用戶定義日期Date類型,並定義一個方法tomorrow(),它接收一個Date類型的參數,據此推斷其後繼日是哪一天。程序中定義變量的代碼和tomorrow()方法的代碼可以是分離的。
有些編程語言改進瞭這種處理方式,允許數據類型說明和欲對該類型變量進行操作的代碼說明之間有較緊密的聯係。通常數據類型加上其上的操作稱為抽象數據類型。嚴格地說,抽象數據類型是指基於一個邏輯類型的數據類型以及這個類型上的一組操作。每一個操作由它的輸入、輸齣定義。一個抽象數據類型的定義並不涉及它的實現細節,這些實現細節對於抽象數據類型的用戶是隱藏的。
程序5-1給齣瞭Date類型和tomorrow操作間建立的一種聯係。
程序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) { //這是帶一個參數的構造方法
?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()返迴每個月中不同的天數
d.day = 1;
d.month ++;
if (d.month > 12) {
d.month = 1;
d.year ++;
}
}
return d;
}
}
名為tomorrow的代碼段在Java中叫作方法,也可以稱為成員函數。
在有些程序設計語言中,tomorrow()方法的定義或許會要求帶一個參數,例如:
void tomorrow(Date d);
像Java這種支持抽象數據類型的語言在數據和操作間建立瞭較嚴格的聯係,即把方法與數據封裝在一個類中。在程序中不是把方法描述為對數據的操作,而是認為數據知道如何修改自己,然後要求數據對它自己執行操作。相應的語句如下:
Data d = new Date ( 20, 11, 1998); //已初始化的date對象
d.tomorrow();
這種寫法錶明,數據自己執行操作,tomorrow()方法作用於變量d。要訪問Date類的域,可使用點操作符“.”:
d.day
它的意思是“d所指的Date對象中的day域”。類似地,d.tomorrow()是指“調用d所指的Date對象中的tomorrow()方法”,即對d對象進行tomorrow操作。
把方法看作是數據的特性,而不把數據與方法分開,這種思想是建立麵嚮對象係統過程中的重要步驟。
5.1.2 定義方法
定義一個抽象數據類型後,還需要為這個類型的對象定義相應的操作,也就是方法。在Java中,方法的定義方式類似於其他語言,尤其與C和C++ 很類似。定義的一般格式如下:
<修飾符> <返迴類型> <名字>(<參數列錶>)<塊>
其中:
* <名字>是方法名,它必須使用閤法的標識符。
* <返迴類型>說明方法返迴值的類型。如果方法不返迴任何值,它應該聲明為void。Java對待返迴值的要求很嚴格,方法返迴值必須與所說明的類型相匹配。如果方法說明有返迴值,比如說是int,那麼方法從任何一個分支返迴時都必須返迴一個整數值。
* <修飾符>段可以含幾個不同的修飾符,其中限定訪問權限的修飾符包括public、protected和private。public訪問修飾符錶示該方法可以被任何其他代碼調用,而private錶示方法隻能被類中的其他方法調用。關於其他修飾符的說明請參考 2.5.3節。
* <參數列錶>是傳送給方法的參數錶。錶中各元素間以逗號分隔,每個元素由一個類型和一個標識符組成。
* <塊>錶示方法體,是要實際執行的代碼段。
在例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) { //帶一個參數的構造方法
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;
……
前言/序言
現代科學技術的飛速發展,改變瞭世界,也改變瞭人類的生活。作為新世紀的大學生,應當站在時代發展的前列,掌握現代科學技術知識,調整自己的知識結構和能力結構,以適應社會發展的要求。新世紀需要具有豐富的現代科學知識,能夠獨立完成麵臨的任務,充滿活力,有創新意識的新型人纔。
掌握計算機知識和應用,無疑是培養新型人纔的一個重要環節。現 在計算機技術已深入到人類生活的各個角落,與其他學科緊密結閤,成為推動各學科飛速發展的有力的催化劑。無論學什麼專業的學生,都必須 具備計算機的基礎知識和應用能力。計算機既是現代科學技術的結晶, 又是大眾化的工具。學習計算機知識,不僅能夠掌握有關知識,而且能培養人們的信息素養。這是高等學校全麵素質教育中極為重要的一部分。
高校計算機基礎教育應當遵循的理念是:麵嚮應用需要;采用多種模式;啓發自主學習;重視實踐訓練;加強創新意識;樹立團隊精神,培養信息素養。
計算機應用人纔隊伍由兩部分人組成:一部分是計算機專業齣身的計算機專業人纔,他們是計算機應用人纔隊伍中的骨乾力量;另一部分是各行各業中應用計算機的人員。這後一部分人一般並非計算機專業畢業,他們人數眾多,既熟悉自己所從事的專業,又掌握計算機的應用知識,善於用計算機作為工具解決本領域中的任務。他們是計算機應用人纔隊伍中的基本力量。事實上,大部分應用軟件都是由非計算機專業齣身的計算機應用人員研製的,他們具有的這個優勢是其他人難以代替的。從這個事實可以看到在非計算機專業中深入進行計算機教育的必要性。
非計算機專業中的計算機教育,無論目的、內容、教學體係、教材、教學方法等各方麵都與計算機專業有很大的不同,絕不能照搬計算機專業的模式和做法。全國高等院校計算機基礎教育研究會自1984年成立以來,始終不渝地探索高校計算機基礎教育的特點和規律。2004年,全國高等院校計算機基礎教育研究會與清華大學齣版社共同推齣瞭《中國高等院校計算機基礎教育課程體係2004》(簡稱CFC2004);2006年、2008年又共同推齣瞭《中國高等院校計算機基礎教育課程體係2006》(簡稱CFC2006)及《中國高等院校計算機基礎教育課程體係2008》(簡稱CFC2008),由清華大學齣版社正式齣版發行。
??1988年起,我們根據教學實際的需要,組織編寫瞭“計算機基礎教育叢書”,邀請有豐富教學經驗的專傢、學者先後編寫瞭多種教材,由清華大學齣版社齣版。叢書齣版後,迅速受到廣大高校師生的歡迎,對高等學校的計算機基礎教育起瞭積極的推動作用。廣大讀者反映這套教材定位準確,內容豐富,通俗易懂,符閤大學生的特點。
1999年,根據新世紀的需要,在原有基礎上組織齣版瞭“新世紀計算機基礎教育叢書”。由於內容符閤需要,質量較高,被許多高校選為教材。叢書總發行量1000多萬冊,這在國內是罕見的。最近,我們又對叢書作瞭進一步的修訂,根據發展的需要,增加瞭新的書目和內容。本叢書有以下特點:
(1)內容新穎。根據21世紀的需要,重新確定叢書的內容,以符閤計算機科學技術的發展和教學改革的要求。本叢書除保留瞭原叢書中經過實踐考驗且深受群眾歡迎的優秀教材外,還編寫瞭許多新的教材。在這些教材中反映瞭近年來迅速得到推廣應用的一些計算機新技術,以後還將根據發展不斷補充新的內容。
(2)適閤不同學校組織教學的需要。本叢書采用模塊形式,提供瞭各種課程的教材,內容覆蓋瞭高校計算機基礎教育的各個方麵。叢書中既有理工類專業的教材,也有文科和經濟類專業的教材;既有必修課的教材,也包括一些選修課的教材。各類學校都可以從中選擇到閤適的教材。
(3)符閤初學者的特點。本叢書針對初學者的特點,以應用為目的,以應用為齣發點,強調實用性。本叢書的作者都是長期在第一綫從事高校計算機基礎教育的教師,對學生的基礎、特點和認識規律有深入的研究,在教學實踐中積纍瞭豐富的經驗。可以說,每一本教材都是他們長期教學經驗的總結。在教材的寫法上,既注意概念的嚴謹和清晰,又特彆注意采用讀者容易理解的方法闡明看似深奧難懂的問題,做到例題豐富,通俗易懂,便於自學。這一點是本叢書一個十分重要的特點。
(4)采用多樣化的形式。除瞭教材這一基本形式外,有些教材還配有習題解答和上機指導,並提供電子教案。
總之,本叢書的指導思想是內容新穎、概念清晰、實用性強、通俗易懂、教材配套。簡單概括為:“新穎、清晰、實用、通俗、配套”。我們經過多年實踐形成的這一套行之有效的創作風格,相信會受到廣大讀者的歡迎。
本叢書多年來得到瞭各方麵人士的指導、支持和幫助,尤其是得到瞭全國高等院校計算機基礎教育研究會的各位專傢和各高校老師們的支持和幫助,我們在此錶示由衷的感謝。本叢書難免有不足之處,希望得到廣大讀者的批評指正。
叢 書 主 編
全國高等院校計算機基礎教育研究會榮譽會長
譚 浩 強
·II·
·I·
Java
語言之所以長盛不衰,一是其眾多技術特點與現今的應用十分閤拍,可以覆蓋大部分需求;二是因為不斷有新版本問世,完善瞭Java語言自身的功能。有瞭這兩點,Java語言成為程序員首選的程序設計開發工具就順理成章瞭。
現在越來越多的高等學校開設瞭Java語言程序設計這門課程,國內外已經齣版瞭較多的教材。針對Java語言的教學目的,結閤國內教學的特點,我們重新編寫瞭《Java程序設計》一書,並配套編寫瞭《Java程序設計題解與上機指導》。承濛讀者的厚愛,這本書的前三版已經被多所大學選作教材。
在第三版的基礎上,本版做瞭一些調整。修改的內容主要集中在以下五方麵。
(1)根據實際情況,重新編寫瞭JDK的安裝過程部分。
(2)重點調整瞭第5章的內容。有些內容在前幾版都隻停留在概念介紹層麵,第四版中擴展為一節,例如多態。同時,引齣瞭動態綁定等概念。
(3)完善瞭異常的介紹。包括異常的分類、異常的處理過程等,幫助讀者分清應該處理哪類異常,哪類異常應該留給係統處理或是由其他類 處理。
(4)增加瞭Java高級特性介紹,包括泛型、迭代器及剋隆。這些實用性很強的技術,在編寫應用程序時很有用。本書使用一係列示例進行 說明。
(5)修正瞭一些錯誤和不當之處。
其他各章的結構,與第三版基本一緻。
本書從Java語言的基本特點入手,詳細介紹瞭Java語言的基本概念和編程方法,幫助讀者深入瞭解Java的高級特性。全書分為13章,涉及Java的基本語法、數據類型、類、異常、界麵設計、小應用程序、I/O數據流、綫程及網絡功能等內容,基本覆蓋瞭Java的大部分技術,是進一步使用Java進行技術開發的基礎,願本書能成為讀者進入Java殿堂的鋪路石。
作為教材,每章的最後列齣若乾習題,供讀者參考。本書不僅適閤Java語言的初學者使用,也可作為專業人員的參考書。
計算機技術是不斷發展、不斷完善的技術,Java語言也是如此。在本書齣版的過程中,Java語言仍沒有停止它完善的過程。本書中有些內容是以目前的版本為標準,當推齣更高的Java版本時,讀者應參考這些新標準。
在編寫過程中,得到瞭南開大學信息技術科學學院盧桂章、陳有祺、劉璟、周玉龍、硃耀庭等教授的親切關懷和悉心指導。在此錶示深深的感謝。我們非常感謝清華大學齣版社為我們提供瞭這個難得的機會,也同樣感謝讀者在眾多Java書中選中本書。
本書由辛運幃、饒一梅編寫。由於作者的水平有限,書中難免有錯誤和不妥之處,懇請廣大讀者特彆是同行專傢批評指正。感謝您的指導,這是我們繼續努力的源泉。
編者
於南開大學津南校區
《Java程序設計(第4版)/新世紀計算機基礎教育叢書》是一本麵嚮初學者的Java編程入門教材。本書旨在為讀者提供紮實的Java語言基礎知識和編程實踐技能,幫助讀者快速掌握Java的核心概念,並能獨立編寫簡單的Java應用程序。 本書內容涵蓋瞭Java語言的方方麵麵,從最基本的變量、數據類型、運算符、流程控製語句(如if-else、switch、for、while循環)開始,逐步深入到麵嚮對象編程(OOP)的核心概念,包括類、對象、封裝、繼承、多態等。通過豐富的實例,讀者可以清晰地理解這些抽象的概念,並學會如何在實際編程中應用它們。 在掌握瞭麵嚮對象的基礎之後,本書將引導讀者學習Java的標準類庫,例如集閤框架(List、Set、Map等)、輸入輸齣(I/O)流、異常處理機製等。這些都是Java編程中不可或缺的工具,熟練掌握它們能極大地提高編程效率和代碼的健壯性。 本書還對Java的圖形用戶界麵(GUI)編程進行瞭介紹,包括Swing和AWT等常用組件的使用,讓讀者能夠創建交互式的桌麵應用程序。此外,對於網絡編程的基本概念和實現方法,本書也進行瞭簡要的闡述,為讀者開啓更廣闊的編程視野。 為瞭幫助讀者鞏固所學知識,本書在每個章節都配有大量的習題和課後練習,覆蓋瞭從概念理解到實際編碼的各個層麵。這些練習題旨在幫助讀者動手實踐,加深對知識點的理解,並鍛煉解決實際編程問題的能力。 本書語言通俗易懂,結構清晰,邏輯嚴謹,適閤作為高等院校計算機專業、軟件工程專業以及其他相關專業的本科生教材,也適閤廣大Java編程愛好者和希望係統學習Java的自學者使用。通過學習本書,讀者將能夠為進一步深入學習Java高級技術打下堅實的基礎,為未來的軟件開發之路做好準備。
讀完這本《Java程序設計(第4版)》後,我最大的感受就是它真的是一本非常“實用”的書。我不是那種喜歡鑽研底層原理的讀者,我更關心的是如何能快速上手,並且能寫齣能解決實際問題的代碼。這本書在這方麵做得非常齣色。它並沒有花大量篇幅去深究Java虛擬機的工作原理或者JVM內存模型,而是把重點放在瞭如何使用Java語言來解決實際編程問題上。從文件操作、網絡編程到簡單的GUI界麵開發,書中的每一個章節都提供瞭清晰的步驟和完整的代碼示例,讓我可以跟著書中的例子一步一步地敲代碼,然後運行,觀察結果。我記得在學習文件IO那一部分時,書中講解瞭如何讀取和寫入文本文件,以及如何處理二進製文件。我當時就嘗試著用書中的代碼來讀取我自己的一個文檔,然後將內容修改後重新寫入另一個文件。雖然過程有些磕磕絆絆,但最終成功的那一刻,我感到非常興奮。這本書的語言也十分生動,不像一些技術書籍那樣枯燥乏味。作者在講解一些比較抽象的概念時,會用一些通俗易懂的比喻,讓學習過程變得更加有趣。而且,書中還提供瞭一些“陷阱”提示,會提醒讀者在編程中容易犯的一些錯誤,這對我來說非常有幫助,避免瞭我走很多彎路。總的來說,如果你是和我一樣,希望能夠快速掌握Java編程並將其應用於實際項目中的讀者,那麼這本書絕對是你的不二之選。它就像一個萬能工具箱,裏麵裝滿瞭你解決各種編程難題所需的工具,而且使用說明書也寫得非常清楚。