Java程序設(shè)計(jì)基礎(chǔ)
羅恩韜 李 文 扈樂華 主 編
黃麗韶 郭力勇 杜 敏 副主編
段華斌 黃偉國(guó)
普通高等院校計(jì)算機(jī)基礎(chǔ)教育“十三五”規(guī)劃教材
副主編
Java程序設(shè)計(jì)基礎(chǔ)
羅恩韜 李 文 扈樂華 主 編
黃麗韶 郭力勇 杜 敏 副主編
段華斌 黃偉國(guó)
普通高等院校計(jì)算機(jī)基礎(chǔ)教育“十三五”規(guī)劃教材
副主編
內(nèi) 容 簡(jiǎn) 介
本書使用開發(fā)環(huán)境是 JDK 1.8+Eclipse 4.7,主要針對(duì) Java 語言開發(fā)初學(xué)者,重點(diǎn)講解
Java 語言的基礎(chǔ)知識(shí)。全書共 10 章,主要介紹 Java 基本語法知識(shí),控制語句,方法,數(shù)組
與字符串,類和對(duì)象,封裝、繼承和多態(tài),抽象類和接口,異常處理機(jī)制,GUI 編程。內(nèi)容
由淺入深,并輔以實(shí)例說明,逐步引領(lǐng)讀者學(xué)習(xí) Java 語言程序設(shè)計(jì)的各個(gè)知識(shí)點(diǎn)。
本書適合作為普通高等院校 Java 程序設(shè)計(jì)課程的教材,也可作為 Java 入門者的參考
用書。
圖書在版編目(CIP)數(shù)據(jù)
Java 程序設(shè)計(jì)基礎(chǔ)/羅恩韜, 李文, 扈樂華主編. — 北京: 中國(guó)鐵道
出版社, 2017.9
普通高等院校計(jì)算機(jī)基礎(chǔ)教育“十三五”規(guī)劃教材
ISBN 978-7-113-23598-7
Ⅰ.①J… Ⅱ.①羅… ②李… ③扈… Ⅲ.①JAVA 語言-程序設(shè)計(jì)-高等
學(xué)校-教材 Ⅳ.①TP312.8
中國(guó)版本圖書館 CIP 數(shù)據(jù)核字(2017)第 215317 號(hào)
書 名:Java 程序設(shè)計(jì)基礎(chǔ)
作 者:羅恩韜 李 文 扈樂華 主編
策 劃:包 寧 讀者熱線:(010)63550836
責(zé)任編輯:劉麗麗 徐盼欣
封面設(shè)計(jì):劉 穎
責(zé)任校對(duì):張玉華
責(zé)任印制:郭向偉
出版發(fā)行:中國(guó)鐵道出版社(100054,北京市西城區(qū)右安門西街 8 號(hào))
網(wǎng) 址:http://www.tdpress.com/51eds/
印 刷:三河市宏盛印務(wù)有限公司
版 次:2017 年 9 月第 1 版 2017 年 9 月第 1 次印刷
開 本:787 mm×1 092 mm 1/16 印張:13.75 字?jǐn)?shù):328 千
書 號(hào):ISBN 978-7-113-23598-7
定 價(jià):38.00 元
版權(quán)所有 侵權(quán)必究
凡購買鐵道版圖書,如有印制質(zhì)量問題,請(qǐng)與本社教材圖書營(yíng)銷部聯(lián)系調(diào)換。電話:(010)63550836
打擊盜版舉報(bào)電話:(010)51873659
Java 是當(dāng)今最為流行的程序開發(fā)語言之一,具有與平臺(tái)無關(guān)、簡(jiǎn)單高效、多線程、
安全和健壯等特點(diǎn),廣泛應(yīng)用于企業(yè)級(jí) Web 應(yīng)用開發(fā)和移動(dòng)應(yīng)用開發(fā)。
要學(xué)好程序設(shè)計(jì),首先要有興趣。本書在結(jié)構(gòu)上作了精心安排,以知識(shí)點(diǎn)和具體實(shí)
例相結(jié)合的方式介紹所有內(nèi)容。在對(duì)細(xì)節(jié)的逐步深入過程中,通過對(duì)問題的求解提升讀
者的學(xué)習(xí)興趣。
本書在對(duì)知識(shí)點(diǎn)進(jìn)行分析和歸納的同時(shí),對(duì)引例作擴(kuò)展或改變,逐步形成更全面、
復(fù)雜的實(shí)例,讓讀者通過對(duì)比加強(qiáng)對(duì)概念的理解,從而達(dá)到舉一反三的學(xué)習(xí)效果??紤]
到知識(shí)的連貫性,各章節(jié)會(huì)在內(nèi)容和實(shí)例上有所聯(lián)系,以涵蓋各知識(shí)點(diǎn)并拓寬讀者思路。
本書的編寫目的在于,進(jìn)一步深化讀者對(duì)基本概念的理解,提高讀者綜合應(yīng)用能力,
使讀者在掌握 Java 面向?qū)ο蟪绦蛟O(shè)計(jì)核心理論與編程思想、技巧的同時(shí),養(yǎng)成良好的編
程習(xí)慣。本書所配備的例題清晰直觀、循序漸進(jìn),并通過通俗易懂且邏輯性強(qiáng)的講解鞏
固知識(shí)點(diǎn)。
本書編者長(zhǎng)期從事教學(xué)工作,積累了豐富的經(jīng)驗(yàn),其“實(shí)戰(zhàn)教學(xué)法”取得了很好的
效果。本書具有以下特點(diǎn):
1.注重基礎(chǔ)性
本書內(nèi)容注重基礎(chǔ)性,深入淺出,并在每章后面安排了大量的習(xí)題,幫助學(xué)生學(xué)習(xí)
每一個(gè)知識(shí)點(diǎn)。
2.兼顧流行性
本書講解的是 Java 開發(fā)過程中最流行的方法,可培養(yǎng)學(xué)生良好的編程風(fēng)格和編程
習(xí)慣。
3.適合教學(xué)
書中每章內(nèi)容安排適當(dāng),符合教學(xué)要求,教師可以根據(jù)具體情況選用,也可以進(jìn)行
適當(dāng)增減。
本書共分 10 章:第 1 章為 Java 概述,介紹 Java 的基本知識(shí)(包括 Java 發(fā)展歷史,
Java 的特點(diǎn)和基本原理);第 2 章為 Java 基本語法知識(shí),重點(diǎn)介紹標(biāo)識(shí)符及關(guān)鍵詞、數(shù)
據(jù)類型、常量與變量,以及運(yùn)算符與表達(dá)式;第 3 章為 Java 控制語句,介紹 Java 的三
大基本結(jié)構(gòu)化程序;第 4 章為方法,重點(diǎn)介紹方法的基本概念,包括方法聲明、方法調(diào)
用、參數(shù)傳遞、方法重載、局部變量和包;第 5 章為數(shù)組與字符串,首先介紹數(shù)組的基
本概念,包括一維數(shù)組和二維數(shù)組,其次介紹字符串相關(guān)類;第 6 章為類和對(duì)象,主要
前 言
介紹類和對(duì)象的基本概念;第 7 章為封裝、繼承和多態(tài),介紹封裝、繼承和多態(tài)三大特
征之間的概念以及聯(lián)系;第 8 章為抽象類和接口,重點(diǎn)介紹抽象類和接口的特點(diǎn)以及主
要作用,應(yīng)靈活掌握其在程序中的使用;第 9 章為 Java 異常處理機(jī)制,重點(diǎn)介紹異常處
理機(jī)制的基本原理、異常處理的過程,以及異常處理的三種方式,最后介紹自定義異常
的實(shí)現(xiàn);第 10 章為 GUI 編程,重點(diǎn)介紹圖形用戶界面編程,利用編程人員對(duì)圖形用戶
界面編程的興趣,將前面 9 章的內(nèi)容結(jié)合起來,將所有內(nèi)容融合成一個(gè)實(shí)例。
本書由羅恩韜、李文、扈樂華任主編,黃麗韶、郭力勇、杜敏、段華斌、黃偉國(guó)任
副主編。具體編寫分工如下:第 1、2 章由李文編寫,第 3、4 章由羅恩韜編寫,第 5
章由黃麗韶編寫,第 6 章由扈樂華編寫,第 7 章由郭力勇編寫,第 8 章由杜敏編寫,
第 9 章由段華斌編寫,第 10 章由黃偉國(guó)編寫。全書由羅恩韜、李文、扈樂華統(tǒng)稿。本
書在編寫過程中參閱了許多優(yōu)秀的同類教材以及網(wǎng)上資料,在此向其作者表示衷心的
感謝。
由于時(shí)間倉促和編者水平有限,書中疏漏和不妥之處在所難免,敬請(qǐng)讀者批評(píng)指正。
編 者
2017 年 7 月
第1章 Java概述...................................................................................... 1
1.1 Java簡(jiǎn)介...................................................................................................................1
1.1.1 Java的歷史.........................................................................................................1
1.1.2 Java的特點(diǎn)........................................................................................................2
1.1.3 Java運(yùn)行基本原理 ............................................................................................4
1.1.4 Java程序的類型 ................................................................................................4
1.2 Java中的OOP...........................................................................................................5
1.2.1 OOP的基本思想 ...............................................................................................5
1.2.2 OOP的發(fā)展過程................................................................................................6
1.2.3 OOP的特點(diǎn) ....................................................................................................... 7
1.3 Java開發(fā)環(huán)境 ..........................................................................................................9
1.3.1 JDK環(huán)境配置 ....................................................................................................9
1.3.2 JDK常用命令....................................................................................................12
1.3.3 Eclipse配置.......................................................................................................16
1.3.4 Eclipse主界面...................................................................................................18
1.3.5 用Eclipse開發(fā)Java應(yīng)用程序...........................................................................20
小結(jié)................................................................................................................................ 22
習(xí)題................................................................................................................................ 22
第2章 Java基本語法知識(shí)........................................................................24
2.1 標(biāo)識(shí)符及關(guān)鍵詞 ....................................................................................................24
2.1.1 標(biāo)識(shí)符 ............................................................................................................24
2.1.2 關(guān)鍵詞.............................................................................................................25
2.1.3 語句及注釋.....................................................................................................25
2.2 數(shù)據(jù)類型 ...............................................................................................................25
2.2.1 基本數(shù)據(jù)類型................................................................................................25
2.2.2 引用數(shù)據(jù)類型 ................................................................................................26
2.3 常量與變量 ...........................................................................................................26
2.3.1 常量 ...............................................................................................................26
2.3.2 變量................................................................................................................28
2.4 運(yùn)算符與表達(dá)式....................................................................................................29
目 錄
2
Java 程序設(shè)計(jì)基礎(chǔ)
2.4.1 算術(shù)運(yùn)算符及表達(dá)式 ....................................................................................29
2.4.2 關(guān)系運(yùn)算符及表達(dá)式......................................................................................31
2.4.3 邏輯運(yùn)算符及表達(dá)式......................................................................................31
2.4.4 位運(yùn)算符及表達(dá)式.........................................................................................32
2.4.5 賦值運(yùn)算符及表達(dá)式.....................................................................................32
2.4.6 其他運(yùn)算符及表達(dá)式.....................................................................................33
2.4.7 運(yùn)算符的優(yōu)先級(jí)與結(jié)合性 .............................................................................33
2.4.8 數(shù)據(jù)類型轉(zhuǎn)換 ................................................................................................34
小結(jié)................................................................................................................................ 35
習(xí)題................................................................................................................................ 36
第3章 Java控制語句 ..............................................................................40
3.1 順序結(jié)構(gòu)語句 .......................................................................................................40
3.1.1 表達(dá)式語句.....................................................................................................40
3.1.2 塊語句.............................................................................................................40
3.2 選擇結(jié)構(gòu)語句 ........................................................................................................41
3.2.1 if語句...............................................................................................................41
3.2.2 switch語句......................................................................................................47
3.2.3 選擇結(jié)構(gòu)語句的嵌套.....................................................................................50
3.3 循環(huán)結(jié)構(gòu)語句 .......................................................................................................53
3.3.1 while循環(huán)語句 ...............................................................................................53
3.3.2 do...while循環(huán)語句 ........................................................................................54
3.3.3 for循環(huán)語句....................................................................................................56
3.4 其他控制語句 .......................................................................................................58
3.4.1 break語句 ......................................................................................................58
3.4.2 continue語句..................................................................................................58
小結(jié)................................................................................................................................ 59
習(xí)題................................................................................................................................ 60
第4章 方法...........................................................................................69
4.1 方法聲明...............................................................................................................69
4.2 方法調(diào)用 ............................................................................................................... 70
4.3 參數(shù)傳遞 ................................................................................................................71
4.4 方法重載 ............................................................................................................... 72
4.5 局部變量 ............................................................................................................... 73
4.6 包........................................................................................................................... 74
4.6.1 package語句 ................................................................................................. 74
4.6.2 import語句 ..................................................................................................... 75
3
目 錄
小結(jié)................................................................................................................................ 75
習(xí)題................................................................................................................................ 76
第5章 數(shù)組與字符串..............................................................................81
5.1 數(shù)組........................................................................................................................81
5.1.1 一維數(shù)組 .........................................................................................................81
5.1.2 多維數(shù)組.........................................................................................................83
5.2 字符串相關(guān)類 .......................................................................................................86
5.2.1 String類 ..........................................................................................................86
5.2.2 StringBuffer類 .................................................................................................89
5.2.3 StringBuilder類 ...............................................................................................90
小結(jié)................................................................................................................................ 90
習(xí)題................................................................................................................................ 91
第6章 類和對(duì)象 ....................................................................................99
6.1 引入實(shí)例................................................................................................................99
6.2 類..........................................................................................................................100
6.2.1 類的定義.......................................................................................................100
6.2.2 成員變量.......................................................................................................100
6.2.3 成員方法....................................................................................................... 101
6.3 對(duì)象...................................................................................................................... 101
6.3.1 對(duì)象的聲明和創(chuàng)建 .......................................................................................102
6.3.2 對(duì)象的使用 ...................................................................................................103
6.4 類的封裝 ..............................................................................................................104
6.4.l 訪問控制屬性................................................................................................104
6.4.2 設(shè)置類的訪問控制屬性................................................................................104
6.4.3 設(shè)置類成員的訪問控制屬性 ........................................................................104
6.5 靜態(tài)成員 ..............................................................................................................106
6.5.1 靜態(tài)變量.......................................................................................................106
6.5.2 靜態(tài)方法.......................................................................................................108
小結(jié).............................................................................................................................. 109
習(xí)題.............................................................................................................................. 110
第7章 封裝、繼承和多態(tài).....................................................................119
7.1 封裝...................................................................................................................... 119
7.2 繼承......................................................................................................................120
7.2.1 繼承的基本概念 ...........................................................................................120
7.2.2 子類對(duì)象的構(gòu)造過程.................................................................................... 121
7.2.3 繼承中的構(gòu)造方法........................................................................................ 121
4
Java 程序設(shè)計(jì)基礎(chǔ)
7.2.4 方法重寫 ....................................................................................................... 121
7.2.5 this關(guān)鍵字 .....................................................................................................122
7.2.6 super關(guān)鍵字..................................................................................................124
7.3 多態(tài)......................................................................................................................126
7.3.1 多態(tài)的概念...................................................................................................126
7.3.2 多態(tài)的實(shí)現(xiàn) ...................................................................................................126
7.3.3 對(duì)象轉(zhuǎn)型 .......................................................................................................127
7.4 equals()方法 .........................................................................................................128
小結(jié).............................................................................................................................. 129
習(xí)題.............................................................................................................................. 130
第8章 抽象類和接口............................................................................139
8.1 抽象類..................................................................................................................139
8.2 接口......................................................................................................................142
8.2.1 接口的定義...................................................................................................142
8.2.2 實(shí)現(xiàn)接口.......................................................................................................142
8.2.3 繼承接口.......................................................................................................143
8.2.4 接口的特征 ...................................................................................................143
8.2.5 比較抽象類與接口........................................................................................144
8.3 final關(guān)鍵字 ...........................................................................................................145
8.4 常用類..................................................................................................................146
8.4.1 基本數(shù)據(jù)類型包裝類 ...................................................................................146
8.4.2 Math類 ..........................................................................................................147
8.4.3 Random類.....................................................................................................148
8.4.4 System類 .......................................................................................................149
8.4.5 Runtime類 .....................................................................................................149
8.4.6 Date類...........................................................................................................150
8.4.7 SimpleDateFormat類 .....................................................................................150
8.4.8 Calendar類....................................................................................................150
小結(jié).............................................................................................................................. 152
習(xí)題.............................................................................................................................. 153
第9章 Java異常處理機(jī)制......................................................................163
9.1 Java異常的基礎(chǔ)知識(shí)...........................................................................................163
9.2 Java異常類類圖...................................................................................................164
9.3 Java異常處理機(jī)制 ...............................................................................................165
9.4 定義和使用異常類...............................................................................................167
9.5 運(yùn)行時(shí)異常和受檢查異常 ...................................................................................168
5
目 錄
9.6 Java異常處理的原則和技巧................................................................................169
小結(jié).............................................................................................................................. 169
習(xí)題.............................................................................................................................. 170
第10章 GUI編程.................................................................................175
10.1 Swing介紹...........................................................................................................175
10.2 Swing控件...........................................................................................................176
10.2.1 JApplet .........................................................................................................176
10.2.2 ImageIcon和JLabel ......................................................................................177
10.2.3 JTextField......................................................................................................179
10.2.4 AbstractButton ............................................................................................. 181
10.2.5 JButton ......................................................................................................... 181
10.2.6 JCheckBox....................................................................................................182
10.2.7 JRadioButton ................................................................................................184
10.2.8 JComboBox ..................................................................................................186
10.2.9 JTabbedPane ...............................................................................................187
10.2.10 JScrollPane..................................................................................................189
10.2.11 JTree ............................................................................................................ 191
10.2.12 JTable .........................................................................................................192
10.3 Swing事件處理 ...................................................................................................192
10.4 Swing事件監(jiān)聽器 ...............................................................................................195
10.5 Swing Layout布局 ...............................................................................................196
10.5.1 BorderLayout................................................................................................196
10.5.2 FlowLayout ...................................................................................................198
10.5.3 GridLayout....................................................................................................199
10.5.4 GridBagLayout..............................................................................................201
10.5.5 CardLayout..................................................................................................204
10.5.6 BoxLayout....................................................................................................205
小結(jié).............................................................................................................................. 206
習(xí)題.............................................................................................................................. 207
參考文獻(xiàn)..............................................................................................210
1
第 1 章 Java 概述
Java 是 20 世紀(jì) 90 年代出現(xiàn)的完全面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,體現(xiàn)了計(jì)算機(jī)編程的新方法、
新思想。本章首先介紹面向?qū)ο蟪绦蛟O(shè)計(jì)的基本概念、特點(diǎn)和基本思想;然后介紹面向?qū)ο蟮?/p>
Java 程序設(shè)計(jì)語言的發(fā)展概況、特點(diǎn)、運(yùn)行機(jī)制和運(yùn)行環(huán)境;最后簡(jiǎn)單介紹 Java 集成編程工具
Eclipse。
1.1 Java 簡(jiǎn)介
Java 是美國(guó) Sun 公司(已于 2009 年被 Oracle 公司收購)研制的一種程序設(shè)計(jì)語言。在高
級(jí)語言已經(jīng)非常豐富的背景下,Java 脫穎而出,獨(dú)樹一幟,在瑞士 TIOBE 公司每月發(fā)布的程序
開發(fā)語言排行榜中,Java 連續(xù)多年名列榜首,說明了人們對(duì) Java 的喜愛程度。
1.1.1 Java 的歷史
1994 年,美國(guó) Sun 公司成立了 Green 項(xiàng)目開發(fā)小組,旨在研制一種能對(duì)家用電器進(jìn)行控制
和通信的分布式代碼系統(tǒng),當(dāng)時(shí)這套系統(tǒng)被命名為 Oak,這就是 Java 的前身。
1994 年前后,正是 Internet 特別是 Web 的大發(fā)展時(shí)期,Sun 公司的研究人員發(fā)現(xiàn) Oak 的許
多特性更適合網(wǎng)絡(luò)編程,于是在這方面進(jìn)行了一系列改進(jìn)和完善,并獲得了成功。 1995 年初,
Sun 公司要給這種語言申請(qǐng)注冊(cè)商標(biāo),由于 Oak 已經(jīng)被人注冊(cè),必須要為這種語言找到一個(gè)新
的名字。在公司召開的命名征集會(huì)上,Mark Opperman 提出 Java 這個(gè)名字。據(jù)說,Mark Opperman
是因品嘗咖啡時(shí)得到靈感的。Java 是印度尼西亞爪哇島的英文名稱,該島因盛產(chǎn)高質(zhì)量的咖啡
而聞名,常被用來當(dāng)做優(yōu)質(zhì)咖啡的代名詞。Mark Opperman 的這個(gè)提議,得到了所有人的認(rèn)可
和律師的通過,Sun 公司用 Java 這個(gè)名字進(jìn)行了注冊(cè),并以一杯熱氣騰騰的咖啡作為標(biāo)志,Java
由此誕生。
Java 從誕生到今天,不斷進(jìn)行改進(jìn)和更新。其發(fā)展歷程大致可以分成以下幾個(gè)階段。
1.誕生期——Java 1.0 和 Java 1.1
Java 1.0 的出現(xiàn)是為了幫助開發(fā)人員建立運(yùn)行環(huán)境并提供開發(fā)工具。1996 年 1 月 23 日,Sun
公司發(fā)布了第一個(gè) Java 開發(fā)工具 JDK 1.0,JDK(Java Development Kit),JDK 1.0 由運(yùn)行環(huán)境(Java
Runtime Enviroment,JRE)及開發(fā)工具(即 JDK)組成,其中運(yùn)行環(huán)境又包括 Java 虛擬機(jī)(Java
Virtual Machine,JVM)、API(Application Programming Interface,應(yīng)用程序接口)和發(fā)布技術(shù)。
1997 年,Sun 公司對(duì) 1.0 版本進(jìn)行了較大的改進(jìn),推出了 JDK 1.1 版本,其中增加了 JIT
第1章 Java概述
2
Java 程序設(shè)計(jì)基礎(chǔ)
(Just-In-Time)編譯器。
2.發(fā)展期——Java 1.2 和 Java 1.3
1998 年 12 月,Java 1.0 誕生近三年后,Sun 公司推出 Java 1.2,并將其改名為 Java2,且把
Java 1.2 以后的版本統(tǒng)稱為 Java2,同時(shí)將 JDK 1.2 改名為 J2SDK(SDK 的全稱為 Software
Development Kit,意為軟件開發(fā)工具),從此 Java 進(jìn)入了快速發(fā)展的階段。1999 年,Sun 公司
發(fā)布 Java 的三個(gè)版本:標(biāo)準(zhǔn)版(Java2 Standard Edition,J2SE)、企業(yè)版(Java2 Enterprise Edition,
J2EE)和微型版(Java2 Micro Edition,J2ME),以適應(yīng)不同的應(yīng)用開發(fā)要求。2000 年,JDK 1.3
發(fā)布。Java 1.3 在 Java 1.2 取得成功的基礎(chǔ)上進(jìn)行了一些改進(jìn),主要是對(duì) API 做了改進(jìn)和擴(kuò)展。
3.成熟期——Java 1.4、Java 1.5 和 Java 1.6
自 Java2 平臺(tái)開始,Java 的發(fā)展日趨成熟穩(wěn)定,此后的 Java 1.4、Java 1.5 和 Java 1.6 主要
在分布式、穩(wěn)定性、可伸縮性、安全性和管理方面進(jìn)行了改進(jìn)和提高。Java 1.4 比 Java 1.3 的運(yùn)
行效率提高了一倍。而從 Java 1.5 版本開始,Java 1.5 改名為 Java 5.0,J2SE 1.5 改名為 J2SE 5.0,
更好地反映出了 J2SE 的成熟度和穩(wěn)定性;Java 1.6(J2SE 6.0)則更強(qiáng)調(diào)管理的易用性,為外部
管理軟件提供更多的交互信息,并更好地集成了圖形化用戶界面。從 2004 年開始,為了更加
突出 Java 本身,而不是 Java 的某個(gè)版本編號(hào),Java 的三個(gè)版本陸續(xù)更名,去掉其中的編號(hào) 2,
J2SE、J2EE、J2ME 更名為 Java SE、Java EE 和 Java ME。
經(jīng)過不斷完善和發(fā)展,Java 已經(jīng)得到業(yè)界的廣泛認(rèn)可,主要體現(xiàn)在工業(yè)界認(rèn)可、軟件開發(fā)
商青睞和編程人員歡迎等幾方面。
① 工業(yè)界認(rèn)可。目前絕大部分計(jì)算機(jī)企業(yè)(包括 IBM、Apple、DEC、Adobe、Silicon Graphics、
HP、Oracle、Toshiba 以及 Microsoft 等公司)都購買了 Java 的許可證,用 Java 開發(fā)相應(yīng)的產(chǎn)品。
這說明 Java 已得到了工業(yè)界的認(rèn)可。
② 軟件開發(fā)商青睞,除購買 Java 許可證,用 Java 開發(fā)新產(chǎn)品以外,眾多的軟件廠商還
在自己已有的產(chǎn)品上增加 Java 接口,以使自己的產(chǎn)品支持 Java 的應(yīng)用。例如 Oracle、Sybase,
Versant 等數(shù)據(jù)庫廠商開發(fā)了 CGI 接口,使得這些數(shù)據(jù)庫支持 Java 開發(fā)。
③ 編程人員歡迎。Java 的一個(gè)重要特點(diǎn)是其網(wǎng)絡(luò)編程能力,因而成為網(wǎng)絡(luò)時(shí)代編程人員最
歡迎的程序設(shè)計(jì)語言之一,各行業(yè)對(duì)掌握 Java 的人員需求量也非常大。
上述事實(shí)說明,Java 是一種得到廣泛應(yīng)用并有很好發(fā)展前景的程序設(shè)計(jì)語言。
1.1.2 Java 的特點(diǎn)
Java 之所以能夠受到如此眾多的好評(píng)并擁有如此迅猛的發(fā)展速度,與其本身的特點(diǎn)是分不
開的。Java 的主要特點(diǎn)如下:
1.面向?qū)ο笤O(shè)計(jì)
面向?qū)ο笤O(shè)計(jì)是 Java 的標(biāo)志特性。作為一種純粹的面向?qū)ο蟪绦蛟O(shè)計(jì)語言,Java 不再支
持面向過程的設(shè)計(jì)方法,而是從面向?qū)ο蟮慕嵌人伎己驮O(shè)計(jì)程序。Java 通過創(chuàng)建類和對(duì)象來
描述和解決問題,支持封裝、繼承、重載、多態(tài)等面向?qū)ο筇匦?,提高了程序的可重用性?/p>
可維護(hù)性。
3
第 1 章 Java 概述
2.簡(jiǎn)單易用
Java 最初的產(chǎn)生源于對(duì)家用電器的控制,其設(shè)計(jì)以簡(jiǎn)單易用、規(guī)模小為原則。一方面,Java
的語法非常簡(jiǎn)單,它不再使用其他高級(jí)程序設(shè)計(jì)語言中諸如指針運(yùn)算、結(jié)構(gòu)、聯(lián)合、多維數(shù)組、
內(nèi)存管理等復(fù)雜的語言現(xiàn)象,降低了程序編寫的難度;另一方面,Java 提供了極為豐富的類庫,
封裝了各種常用的功能,程序設(shè)計(jì)人員無須對(duì)這些常用的功能自行編寫程序,只要直接調(diào)用即
可,盡可能降低了程序設(shè)計(jì)人員的工作量。
3.平臺(tái)無關(guān)性
Java 的平臺(tái)無關(guān)性主要體現(xiàn)在三方面。首先,Java 運(yùn)行環(huán)境是 Java 虛擬機(jī),Java 虛擬機(jī)負(fù)
責(zé)解釋編譯后的 Java 代碼并將其轉(zhuǎn)換成特定系統(tǒng)的機(jī)器碼,再由機(jī)器加以執(zhí)行。Java 虛擬機(jī)屏
蔽了具體平臺(tái)的差異性,用 Java 編寫的應(yīng)用程序無須重新編譯就可以在不同平臺(tái)的 Java 虛擬
機(jī)上運(yùn)行,實(shí)現(xiàn)了平臺(tái)無關(guān)性。其次,Java 的數(shù)據(jù)類型被設(shè)計(jì)成不依賴于具體機(jī)器。例如,整
數(shù)總是 32 位,長(zhǎng)整數(shù)總是 64 位。這樣,Java 基本數(shù)據(jù)類型及其運(yùn)算在任何平臺(tái)上都是一致的,
不會(huì)因平臺(tái)的變化而改變。第三,Java 核心類庫與平臺(tái)無關(guān),對(duì)類庫的調(diào)用,不會(huì)影響 Java
的跨平臺(tái)性。
4.安全性和健壯性
Java 去除了指針和內(nèi)存管理等易出錯(cuò)的操作,在程序設(shè)計(jì)上增強(qiáng)了安全性。而且,Java 作
為網(wǎng)絡(luò)開發(fā)語言,提供了多層保護(hù)機(jī)制增強(qiáng)安全性,例如,不允許 Applet 運(yùn)行和讀/寫任何瀏
覽器端機(jī)器上的程序等。此外,Java 注重盡早發(fā)現(xiàn)錯(cuò)誤。Java 編譯器可以檢査出很多開發(fā)早期
的錯(cuò)誤,增強(qiáng)了程序設(shè)計(jì)的安全性和健壯性。
5.性能優(yōu)異
Java 可以在運(yùn)行時(shí)直接將目標(biāo)代碼翻譯成機(jī)器指令,充分地利用硬件平臺(tái)資源,從而可以
得到較高的整體性能。另外,與 Java 有關(guān)的廠商在不斷完善 Java 的 JIT 編譯器技術(shù),旨在提高
Java 的運(yùn)行速度。從基準(zhǔn)測(cè)試來看,Java 的運(yùn)行速度超過了典型的腳本語言,越來越接近 C 和
C++。
6.分布式
分布式是指在由網(wǎng)絡(luò)相連的不同平臺(tái)上,可以在獨(dú)立運(yùn)行時(shí)間內(nèi)運(yùn)行不同程序。Java 作為
一種強(qiáng)大的網(wǎng)絡(luò)開發(fā)語言,其能力主要體現(xiàn)在開發(fā)分布式網(wǎng)絡(luò)應(yīng)用。Java 語言本身的特點(diǎn)很適
合開發(fā)基于 Internet 的分布式應(yīng)用程序,并且提供了完備的適應(yīng)分布式應(yīng)用的程序庫。Java 支
持 TCP/IP 協(xié)議及其他協(xié)議,可以通過 URL(Uniform Resource Locator,統(tǒng)一資源定位符)實(shí)現(xiàn)
對(duì)網(wǎng)絡(luò)上其他對(duì)象的訪問,實(shí)現(xiàn)分布式應(yīng)用。
7.多線程
Java 支持多線程,允許在程序中并發(fā)地執(zhí)行多個(gè)指令流或程序片段,以更好地利用系統(tǒng)資
4
Java 程序設(shè)計(jì)基礎(chǔ)
源,提高程序的運(yùn)行效率。Java 不僅支持多線程,而且對(duì)線程劃分了優(yōu)先級(jí),以更好地支持系
統(tǒng)的交互和實(shí)時(shí)響應(yīng)能力。此外,Java 具備線程同步功能,確保了計(jì)算結(jié)果的可預(yù)測(cè)性,有助
于對(duì)程序進(jìn)行更好的控制。
1.1.3 Java 運(yùn)行基本原理
Java 程序的運(yùn)行機(jī)制與 C/C++等程序設(shè)計(jì)語言有較大的差別,這種差別也是保證 Java 具
有更強(qiáng)動(dòng)態(tài)性和平臺(tái)無關(guān)性的基礎(chǔ)。概括來說,Java 的運(yùn)行有三個(gè)步驟:編寫、編譯和運(yùn)行。
① 編寫是指利用編輯器生成 Java 程序代碼,形成 Java 源文件。Java 程序以.java 為擴(kuò)展
名。一個(gè) Java 應(yīng)用程序中可能會(huì)包括多個(gè) Java 的類,這些類可以放在同一個(gè) Java 源文件中,
也可以為每一個(gè)類分別編寫一個(gè)源文件。
② 編譯是指 Java 編譯器將編輯好的 Java 源程序轉(zhuǎn)換成 JVM 可以識(shí)別的字節(jié)碼的過程。
字節(jié)碼是一種獨(dú)立于操作系統(tǒng)和機(jī)器平臺(tái)的中間代碼,用二進(jìn)制形式表示,由 JVM 解釋后才
能在機(jī)器上運(yùn)行。編譯成功后,Java 編譯器生成擴(kuò)展名為.class 的字節(jié)碼文件。如果一個(gè) Java
源程序中包含了多個(gè)類,編譯后會(huì)生成多個(gè)對(duì)應(yīng)的.class 文件。
③ 運(yùn)行是指 JVM 將編譯生成的. class 字節(jié)碼文件翻譯為與硬件環(huán)境及操作系統(tǒng)匹配的代
碼,并運(yùn)行和顯示結(jié)果。JVM 可以將 Java 字節(jié)碼程序和具體的操作系統(tǒng)及硬件區(qū)分開,而不用
考慮程序文件要在何種平臺(tái)上運(yùn)行,從而保證了 Java 語言的平臺(tái)無關(guān)性和動(dòng)態(tài)性。
圖 1-1 所示是 Java 程序編寫、編譯和運(yùn)行的過程。
圖 1-1 Java 程序編寫、編譯和運(yùn)行的過程
1.1.4 Java 程序的類型
Java 支持開發(fā) 4 種基本類型的程序,分別是 Java 應(yīng)用程序(Java Application)、Java 小應(yīng)
用程序(Java Applet)、服務(wù)器端小程序(Java Servlet)以及可重用 Java 組件 JavaBean。這 4
種類型的 Java 程序都遵循 Java 的基本編程結(jié)構(gòu),并且都要在 Java 虛擬機(jī)上運(yùn)行,它們的表現(xiàn)
形式都是 Java 的類。
1.Java 應(yīng)用程序
Java 應(yīng)用程序是指完整的、可以獨(dú)立運(yùn)行的 Java 程序。一個(gè) Java 應(yīng)用程序由一個(gè)或多個(gè)
類組成。Java 應(yīng)用程序經(jīng)過編譯之后,可在 Java 虛擬機(jī)上獨(dú)立運(yùn)行,完成一定的功能。在組成
Java 應(yīng)用程序的類中,必須有一個(gè)類中包含有 main()方法(或稱 main()函數(shù)),該方法是 Java
的內(nèi)置方法,作用是提供 Java 應(yīng)用程序的入口。Java 虛擬機(jī)從 main()方法開始執(zhí)行 Java 應(yīng)用
程序。包含 main()方法的類稱為 Java 應(yīng)用程序的主類(簡(jiǎn)稱主類)。在編寫 Java 源程序時(shí),
如果將 Java 應(yīng)用程序所包含的多個(gè)類同時(shí)寫在一個(gè)文件中,則該文件名必須和主類的類名保持
一致,并以.java 為擴(kuò)展名。如果將不同的類分別寫在不同的文件中,通常將源文件命名為與其
包含的類名相同,并以.java 為擴(kuò)展名。
5
第 1 章 Java 概述
2.Java 小應(yīng)用程序
Java 小應(yīng)用程序簡(jiǎn)稱 Applet,是一種嵌在 HTML 頁中由 Web 瀏覽器激活 Java 虛擬機(jī)來運(yùn)
行的程序。也就是說,Applet 本身不能獨(dú)立運(yùn)行,必須以 Web 瀏覽器為其容器才能運(yùn)行,因此,
可以簡(jiǎn)單地將 Applet 理解成由 Web 瀏覽器來執(zhí)行的程序。Applet 部署在服務(wù)器端,當(dāng)用戶訪
問嵌入了 Applet 的網(wǎng)頁時(shí),相應(yīng)的 Applet 被下載到客戶端的機(jī)器上執(zhí)行。Applet 通常用來在網(wǎng)
頁上實(shí)現(xiàn)與用戶的交互功能或者實(shí)現(xiàn)動(dòng)態(tài)的多媒體效果,使得網(wǎng)頁更具活力。能夠執(zhí)行 Applet
的瀏覽器必須支持 Java。
3.服務(wù)器端小程序
服務(wù)器端小程序簡(jiǎn)稱 Servlet,是一種用 Java 編寫的服務(wù)器端程序。Servlet 以 Web 服務(wù)器
為容器,靠 Web 服務(wù)器來加載和運(yùn)行。和 Applet 一樣,Servlet 本身不能獨(dú)立運(yùn)行;但與 Applet
不同的是,Applet 在客戶端運(yùn)行,Servlet 在服務(wù)器端運(yùn)行。Servlet 的作用是接收、處理客戶端
的請(qǐng)求并將響應(yīng)發(fā)送到客戶端,從而實(shí)現(xiàn)客戶端計(jì)算機(jī)與服務(wù)器端計(jì)算機(jī)之間的交互。利用
Servlet 技術(shù),可以擴(kuò)展 Web 服務(wù)器能力,充分利用 Web 服務(wù)器上的資源(如文件、數(shù)據(jù)庫、
應(yīng)用程序等)。能夠執(zhí)行 Servlet 的服務(wù)器必須支持 Java。
4.JavaBean
JavaBean 是一種用 Java 編寫的可重用的軟件組件,目前尚沒有統(tǒng)一的中文譯名。JavaBean
本身不能獨(dú)立運(yùn)行,必須以 Java 應(yīng)用程序、Applet、Servlet 或者 JavaBean 為容器才能運(yùn)行。
JavaBean 有兩種類型,一種是可視化的 JavaBean,另一種是非可視化的 JavaBean??梢暬?/p>
JavaBean 具有圖形界面,可以包括窗體、按鈕、文本框、報(bào)表元素等。非可視化的 JavaBean 不
包括圖形界面,主要用來實(shí)現(xiàn)業(yè)務(wù)邏輯或封裝業(yè)務(wù)對(duì)象??梢暬?Javabean 是 JavaBean 的傳
統(tǒng)應(yīng)用,隨著網(wǎng)絡(luò)的興起,非可視化的 JavaBean 應(yīng)用越來越廣泛,它與 JSP(Java Server Pages)
技術(shù)相結(jié)合,成為當(dāng)前開發(fā) Web 應(yīng)用的主流模式。
1.2 Java 中的 OOP
面向?qū)ο蟪绦蛟O(shè)計(jì)(Object-Oriented Programming,OOP)是計(jì)算機(jī)軟件技術(shù)發(fā)展過程中的
一個(gè)重大飛越,它能更好地適合軟件開發(fā)在規(guī)模、復(fù)雜性、可靠性和質(zhì)量、效率上的需求,因
而被廣泛應(yīng)用,并逐漸成為當(dāng)前的主流程序設(shè)計(jì)方法。
1.2.1 OOP 的基本思想
面向?qū)ο蟪绦蛟O(shè)計(jì)代表了一種全新的程序設(shè)計(jì)思路和表達(dá)、處理問題的方法。在解決問題
的過程中,面向?qū)ο蟪绦蛟O(shè)計(jì)以問題中所涉及的各種對(duì)象為主要線索,關(guān)心的是對(duì)象以及對(duì)象
之間的相互關(guān)系,以符合人們?nèi)粘5乃季S習(xí)慣來求解問題,降低、分解了問題的難度和復(fù)雜性,
提高了整個(gè)求解過程的可控性、可監(jiān)測(cè)性和可維護(hù)性,從而能以較小的代價(jià)和較高的效率對(duì)問
題進(jìn)行求解。簡(jiǎn)言之,面向?qū)ο蟪绦蛟O(shè)計(jì)的特點(diǎn)是使用對(duì)象模型對(duì)客觀世界進(jìn)行抽象,分析出
6
Java 程序設(shè)計(jì)基礎(chǔ)
事物的本質(zhì)特征,從而對(duì)問題進(jìn)行求解。面向?qū)ο蟪绦蛟O(shè)計(jì)的思想認(rèn)為世界是由各種各樣具有
各自運(yùn)動(dòng)規(guī)律和內(nèi)部狀態(tài)的對(duì)象組成的,不同對(duì)象之間的相互通信和作用構(gòu)成了現(xiàn)實(shí)世界,因
此,人們應(yīng)當(dāng)按照現(xiàn)實(shí)世界本來的面貌理解世界,直接通過對(duì)象及其相互關(guān)系來反映世界,這
樣建立起來的系統(tǒng)才符合世界本來的面貌,才會(huì)對(duì)現(xiàn)實(shí)世界的變化有很好的適應(yīng)性。所以,面
向?qū)ο蠓椒◤?qiáng)調(diào)程序系統(tǒng)的結(jié)構(gòu)應(yīng)當(dāng)與現(xiàn)實(shí)世界的結(jié)構(gòu)相對(duì)應(yīng),應(yīng)當(dāng)圍繞現(xiàn)實(shí)世界中的對(duì)象來
構(gòu)造程序系統(tǒng)。
所謂對(duì)象,是指現(xiàn)實(shí)世界的實(shí)體或概念在計(jì)算機(jī)程序中的抽象表示。具體地說,程序設(shè)計(jì)
中的對(duì)象是指具有唯一對(duì)象名和一組固定對(duì)外接口的屬性和操作的集合,它用來模擬組成或影
響現(xiàn)實(shí)世界問題的一個(gè)或一組因素。其中,對(duì)象名是用于區(qū)別對(duì)象的標(biāo)識(shí);對(duì)象的對(duì)外接口是
在約定好的運(yùn)行框架和消息傳遞機(jī)制下與外界進(jìn)行通信的通道;對(duì)象的屬性表現(xiàn)了它所處的狀
態(tài);對(duì)象的操作(也稱方法)是用來改變對(duì)象狀態(tài)的特定功能。
具體地說,面向?qū)ο蟪绦蛟O(shè)計(jì)的思想主要體現(xiàn)在如下幾方面:
① 面向?qū)ο蟪绦蛟O(shè)計(jì)的核心和首要問題是標(biāo)識(shí)對(duì)象,而不是標(biāo)識(shí)程序中的功能(函數(shù)/過
程)。從面向?qū)ο蟪绦蛟O(shè)計(jì)的角度來看,對(duì)象作為現(xiàn)實(shí)世界中事物的基本組成部分,是系統(tǒng)框
架中最穩(wěn)定的因素,對(duì)象描述清楚了,就能夠很容易地找出它們之間的關(guān)系,從而發(fā)現(xiàn)它們之
間的相互作用,進(jìn)而解決問題。
② 正是由于把標(biāo)識(shí)對(duì)象作為解決問題的出發(fā)點(diǎn),面向?qū)ο蟪绦蛟O(shè)計(jì)在整體上說是一種自
底向上的開發(fā)方法。面向?qū)ο蟮幕舅枷雽⒊绦蚩醋鞅姸鄥f(xié)同工作的對(duì)象所組成的集合,這些
對(duì)象相互作用構(gòu)成系統(tǒng)完整的功能,因此在設(shè)計(jì)開發(fā)程序時(shí),面向?qū)ο蟮姆椒ò凑諛?biāo)識(shí)對(duì)象、
定義對(duì)象屬性和操作、明確對(duì)象之間事件驅(qū)動(dòng)和消息關(guān)系,最后形成程序的整體結(jié)構(gòu)順序進(jìn)行。
③ 同任何其他應(yīng)用系統(tǒng)開發(fā)一樣,面向?qū)ο蟪绦蛟O(shè)計(jì)在概念模式與系統(tǒng)組成模式上的一
致性,使得面向?qū)ο蟪绦蛟O(shè)計(jì)過程中的各個(gè)階段是一種自然平滑的過渡,各階段的界限不是那
么明顯。系統(tǒng)分析階段的結(jié)果能夠直接映射成系統(tǒng)設(shè)計(jì)的概念,系統(tǒng)設(shè)計(jì)階段的結(jié)果可以方便
地翻譯成實(shí)施階段的程序組件,反之亦然。這樣,系統(tǒng)設(shè)計(jì)和開發(fā)人員就能夠容易地跟蹤整個(gè)
系統(tǒng)開發(fā)過程,了解各個(gè)階段所發(fā)生的變化,不斷對(duì)各個(gè)階段進(jìn)行完善。
總之,面向?qū)ο蟪绦蛟O(shè)計(jì)方法更符合人們對(duì)客觀世界的認(rèn)識(shí)規(guī)律,開發(fā)的軟件系統(tǒng)易于維
護(hù)、理解、擴(kuò)充和修改,并支持軟件的復(fù)用。從 20 世紀(jì) 90 年代開始,面向?qū)ο蟪绦蛟O(shè)計(jì)的方
法逐漸成為軟件開發(fā)的主流方法。
1.2.2 OOP 的發(fā)展過程
面向?qū)ο蟪绦蛟O(shè)計(jì)方法作為一種程序設(shè)計(jì)規(guī)范,其發(fā)展與程序設(shè)計(jì)語言的發(fā)展密切相關(guān)。
事實(shí)上,最早的面向?qū)ο蟪绦蛟O(shè)計(jì)的一些概念正是由一些特定語言機(jī)制體現(xiàn)出來的。
20 世紀(jì) 50 年代后期,為了解決 FORTRAN 語言編寫大型軟件時(shí)出現(xiàn)的變量名在不同程序
段中的沖突問題,ALGOL 語言設(shè)計(jì)者采用了“阻隔”(Barriers)的方式來區(qū)分不同程序段中的
變量名,在程序設(shè)計(jì)語言 ALGOL60 中用 Begin...End 為標(biāo)識(shí)對(duì)程序進(jìn)行分段,以便區(qū)分不同程
序段中的同名變量,這也是首次在編程語言中出現(xiàn)保護(hù)(Protection)和封裝(Encapsulation)
的思想。
20 世紀(jì) 60 年代,挪威科學(xué)家 O. J. Dahl 和 K. Nygaard 等采用了 ALGOL 語言中的思想,設(shè)
計(jì)出用于模擬離散事件的程序設(shè)計(jì)語言 Simula 67。與以往程序設(shè)計(jì)語言不同,Simula 67 從一個(gè)
7
第 1 章 Java 概述
全新的角度描述并理解客觀事實(shí),首次在程序設(shè)計(jì)中將數(shù)據(jù)和與之對(duì)應(yīng)的操作結(jié)合成一個(gè)整體,
提出“封裝”的概念,它的類型結(jié)構(gòu)和以后的抽象數(shù)據(jù)類型基本是一樣的。盡管 Simula 67 還
不是真正的面向?qū)ο蟪绦蛟O(shè)計(jì)語言,但它提出的思想標(biāo)志著面向?qū)ο蠹夹g(shù)正式登上歷史舞臺(tái)。
真正的面向?qū)ο蟪绦蛟O(shè)計(jì)語言是由美國(guó) Alan Keyz 主持設(shè)計(jì)的 Smalltalk 語言。Smalltalk 這個(gè)名
字源自 Talk Small(少說話),意思是可以通過很少的工作量完成許多任務(wù)。Smalltalk 在設(shè)計(jì)中
強(qiáng)調(diào)對(duì)象概念的統(tǒng)一,引入了對(duì)象、對(duì)象類、方法、實(shí)例等概念和術(shù)語,采用了動(dòng)態(tài)聯(lián)編和單
繼承機(jī)制。用 Smalltalk 編寫的程序具有封裝、繼承、多態(tài)等特性,由此奠定了面向?qū)ο蟪绦蛟O(shè)
計(jì)的基礎(chǔ)。20 世紀(jì) 80 年代以后,美國(guó) Xerox 公司推出了 Smalltalk-80,引起人們的廣泛重視。
Smalltalk 語言的出現(xiàn)引發(fā)了學(xué)術(shù)界對(duì)面向?qū)ο蟪绦蛟O(shè)計(jì)的廣泛重視,隨之涌現(xiàn)出了很多面
向?qū)ο蟮南到y(tǒng)分析與設(shè)計(jì)方法,誕生了一系列面向?qū)ο蟮恼Z言,如 C++、Eiffel、Ada 和 CLOS
等。 其中,C++不僅繼承了 C 語言易于掌握、使用簡(jiǎn)單的特點(diǎn),而且增加了眾多支持面向?qū)ο?/p>
程序設(shè)計(jì)的特性,促進(jìn)了面向?qū)ο蟪绦蛟O(shè)計(jì)技術(shù)的發(fā)展。
20 世紀(jì) 90 年代,美國(guó) Sun 公司提出的面向?qū)ο蟮某绦蛟O(shè)計(jì)語言 Java,被認(rèn)為是面向?qū)ο?/p>
程序設(shè)計(jì)的一次革命。Java 去除了 C++中為了兼容 C 語言而保留的非面向?qū)ο蟮膬?nèi)容,使程序
更加嚴(yán)謹(jǐn)、可靠、易懂。尤其是 Java 所特有的“一次編寫、多次使用”的跨平臺(tái)優(yōu)點(diǎn),使得它
非常適合在 Internet 應(yīng)用開發(fā)中使用。
從面向?qū)ο蟪绦蛟O(shè)計(jì)語言的發(fā)展歷程可以看出,面向?qū)ο蟪绦蛟O(shè)計(jì)語言是經(jīng)過研究人員的
不斷改進(jìn)與優(yōu)化,才形成了今天的模樣。正是由于這種語言更好地適應(yīng)了軟件開發(fā)過程中規(guī)模、
復(fù)雜性、可靠性和質(zhì)量、效率上的需求,并且在實(shí)踐中得到了檢驗(yàn),才逐漸成為當(dāng)前主流的程
序設(shè)計(jì)方法。
1.2.3 OOP 的特點(diǎn)
面向?qū)ο蟪绦蛟O(shè)計(jì)有許多特點(diǎn),這里重點(diǎn)介紹其主要特點(diǎn)。
1.抽象
抽象(Abstract)是日常生活中經(jīng)常使用的一種方法,即去除被認(rèn)識(shí)對(duì)象中與主旨無關(guān)的部
分,或是暫不予考慮的部分,而僅僅抽取出與認(rèn)識(shí)目的有關(guān)的、實(shí)質(zhì)性的內(nèi)容加以考察。在計(jì)
算機(jī)程序設(shè)計(jì)中所使用的抽象有兩類:一類是過程抽象;另一類是數(shù)據(jù)抽象。
過程抽象將整個(gè)系統(tǒng)的功能劃分為若干部分,強(qiáng)調(diào)功能完成的過程和步驟。面向過程的軟
件開發(fā)方法采用的就是這種抽象方法。使用過程抽象有利于控制、降低整個(gè)程序的復(fù)雜程度,
但是這種方法本身自由度較大,難于規(guī)范化和標(biāo)準(zhǔn)化,操作起來有一定難度,質(zhì)量上不易保證。
數(shù)據(jù)抽象是與過程抽象不同的抽象方法,它把系統(tǒng)中需要處理的數(shù)據(jù)和這些數(shù)據(jù)上的操作
結(jié)合在一起,根據(jù)功能、性質(zhì)、作用等因素抽象成不同的抽象數(shù)據(jù)類型。每個(gè)抽象數(shù)據(jù)類型既
包含數(shù)據(jù),也包含針對(duì)這些數(shù)據(jù)的授權(quán)操作,是相對(duì)于過程抽象而言更為嚴(yán)格、也更為合理的
抽象方法。
面向?qū)ο蟪绦蛟O(shè)計(jì)的主要特點(diǎn)之一,就是采用了數(shù)據(jù)抽象的方法來構(gòu)建程序的類、對(duì)象和
方法。在面向?qū)ο蟪绦蛟O(shè)計(jì)中使用的數(shù)據(jù)抽象方法,一方面可以去除與核心問題無關(guān)的細(xì)節(jié),
使開發(fā)工作可以集中在關(guān)鍵、重要的部分;另一方面,在數(shù)據(jù)抽象過程中,對(duì)數(shù)據(jù)操作的分析、
辨別和定義可以幫助開發(fā)人員對(duì)整個(gè)問題有更深入、準(zhǔn)確的認(rèn)識(shí),最后抽象形成的抽象數(shù)據(jù)類
8
Java 程序設(shè)計(jì)基礎(chǔ)
型則是進(jìn)一步設(shè)計(jì)、編程的基礎(chǔ)和依據(jù)。
2.封裝
封裝(Encapsulation)是面向?qū)ο蟪绦蛟O(shè)計(jì)的重要特征之一。面向?qū)ο蟪绦蛟O(shè)計(jì)的封裝特
性與其抽象特性密切相關(guān)。封裝是指利用抽象數(shù)據(jù)類型將數(shù)據(jù)和基于數(shù)據(jù)的操作結(jié)合并包封到
一起,數(shù)據(jù)被保護(hù)在抽象數(shù)據(jù)類型的內(nèi)部,系統(tǒng)的其他部分只能通過對(duì)象所提供的操作來間接
訪問對(duì)象內(nèi)部的私有數(shù)據(jù),與這個(gè)抽象數(shù)據(jù)類型進(jìn)行交流和交互。
在面向?qū)ο蟪绦蛟O(shè)計(jì)中,抽象數(shù)據(jù)類型是用“類”這種面向?qū)ο蠊ぞ呖衫斫夂涂刹僮鞯慕Y(jié)
構(gòu)來代表的。每個(gè)類里都封裝了相關(guān)的數(shù)據(jù)和操作。在實(shí)際的開發(fā)過程中,類多用來構(gòu)建系統(tǒng)
內(nèi)部的模塊。由于封裝特性把類內(nèi)的數(shù)據(jù)保護(hù)得很嚴(yán)密,模塊與模塊之間僅通過嚴(yán)格控制的接
口進(jìn)行交互,大大減少了它們之間的耦合和交叉,從而降低了開發(fā)過程的復(fù)雜性,提高了開發(fā)
效率和質(zhì)量,減少了可能的錯(cuò)誤,同時(shí)也保證了程序中數(shù)據(jù)的完整性和安全性。
面向?qū)ο蟪绦蛟O(shè)計(jì)的這種封裝特性還有另一個(gè)重要意義,就是抽象數(shù)據(jù)類型,即類或模塊
的可重用性大為提高。封裝使得抽象數(shù)據(jù)類型對(duì)內(nèi)成為一個(gè)結(jié)構(gòu)完整、可自我管理、自我平衡、
高度集中的整體;對(duì)外則是一個(gè)功能明確、接口單一、在各種合適的環(huán)境下都能獨(dú)立工作的有
機(jī)單元,這樣的有機(jī)單元特別有利于構(gòu)建、開發(fā)大型、標(biāo)準(zhǔn)化的應(yīng)用軟件系統(tǒng),可以大幅提高
生產(chǎn)效率,縮短開發(fā)周期和降低各種費(fèi)用。
3.繼承
繼承(Inheritance)是面向?qū)ο蟪绦蛟O(shè)計(jì)中最具有特色也與傳統(tǒng)方法最不相同的一個(gè)特點(diǎn)。
繼承是存在于面向?qū)ο蟪绦虻膬蓚€(gè)類之間的一種關(guān)系,是組織、構(gòu)造和重用類的一種方法。當(dāng)
一個(gè)類具有另一個(gè)類的所有數(shù)據(jù)和操作時(shí),就稱這兩個(gè)類之間具有繼承關(guān)系,被繼承的類稱為
父類或超類,繼承了父類或超類所有屬性和方法的類稱為子類。通過繼承,可以將公用部分定
義在父類中,不同部分定義在子類中,這樣公用部分可以從父類中繼承下來,避免了公用代碼
的重復(fù)開發(fā),實(shí)現(xiàn)了軟件和程序的可重用性;同時(shí),對(duì)父類中公用部分的修改也會(huì)自動(dòng)傳播到
子類中,而無須對(duì)子類做任何修改,這樣有利于代碼的維護(hù)。
一個(gè)父類可以同時(shí)擁有多個(gè)子類,這時(shí)該父類實(shí)際是所有子類的公共屬性的集合,而每個(gè)
子類則是父類的特殊化,是在父類公共屬性的基礎(chǔ)上進(jìn)行的功能和內(nèi)涵的擴(kuò)展及延伸。
在面向?qū)ο蟪绦蛟O(shè)計(jì)的繼承特性中,有單重繼承和多重繼承之分。單重繼承是指任何一個(gè)
類都只有一個(gè)單一的父類;多重繼承是指一個(gè)類可以有一個(gè)以上的父類,它的靜態(tài)數(shù)據(jù)屬性和
操作從所有父類中繼承。采用單重繼承的程序結(jié)構(gòu)比較簡(jiǎn)單,是單純的樹狀結(jié)構(gòu),掌握、控制
起來相對(duì)容易。支持多重繼承的程序,其結(jié)構(gòu)則是復(fù)雜的網(wǎng)狀,設(shè)計(jì)、實(shí)現(xiàn)都比較復(fù)雜。在現(xiàn)
實(shí)世界中,問題的內(nèi)部結(jié)構(gòu)多為復(fù)雜的網(wǎng)狀,用多重繼承的程序模擬起來比較自然,但會(huì)導(dǎo)致
編程方面的復(fù)雜性。單重繼承的程序結(jié)構(gòu)簡(jiǎn)單,實(shí)現(xiàn)方便,但要解決網(wǎng)狀的繼承關(guān)系則需要其
他一些輔助措施。
在面向?qū)ο蟪绦蛟O(shè)計(jì)中,采用繼承的機(jī)制來組織、設(shè)計(jì)系統(tǒng)中的類,可以提高程序的抽象
程度,使之更接近于人類的思維方式,同時(shí)也可以提高程序的開發(fā)效率,減少維護(hù)的工作量。
9
第 1 章 Java 概述
4.多態(tài)
多態(tài)(Polymorphism)是面向?qū)ο蟪绦蛟O(shè)計(jì)的又一個(gè)特殊特性。所謂多態(tài),是指一個(gè)程序中
同名的不同方法共存的情況,在使用面向過程語言編程時(shí),主要工作是編寫一個(gè)個(gè)的過程或函數(shù),
這些過程或函數(shù)各自對(duì)應(yīng)一定的功能,它們之間是不能重名的,否則在用名字調(diào)用時(shí),就會(huì)產(chǎn)生
歧義和錯(cuò)誤;而在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,有時(shí)卻需要利用這樣的“重名”現(xiàn)象來提高程序的抽
象度和簡(jiǎn)潔性。
對(duì)象程序設(shè)計(jì)中的多態(tài)有多種表現(xiàn)方式,可以通過子類對(duì)父類方法的覆蓋實(shí)現(xiàn)多態(tài),也可
以重載在同一個(gè)類中定義多個(gè)同名的不同方法,等等。多態(tài)的特點(diǎn)大大提高了程序的抽象程度
和簡(jiǎn)潔性,更為重要的是,它最大限度地降低了類和程序模塊之間的耦合性,使得它們不需要
了解對(duì)方的具體細(xì)節(jié),就可以很好地工作。這個(gè)優(yōu)點(diǎn)対應(yīng)用系統(tǒng)的設(shè)計(jì)、開發(fā)和維護(hù)都有很大
的好處。
1.3 Java 開發(fā)環(huán)境
要在一臺(tái)計(jì)算機(jī)上編寫和運(yùn)行 Java 程序,首先要建立 Java 運(yùn)行環(huán)境。建立 Java 運(yùn)行環(huán)境
就是在計(jì)算機(jī)上安裝 Java 開發(fā)工具包(JDK),并在計(jì)算機(jī)中設(shè)置相應(yīng)的參數(shù),使 Java 程序
在計(jì)算機(jī)中正確運(yùn)行。
1.3.1 JDK 環(huán)境配置
JDK 是 Sun 公司提供的免費(fèi) Java 開發(fā)工具包,現(xiàn)在分化成為三種版本:Java SE、Java EE
和 Java ME。Java SE 是用于工作站和個(gè)人計(jì)算機(jī)的標(biāo)準(zhǔn)開發(fā)工具包;Java EE 是應(yīng)用于企業(yè)級(jí)開
發(fā)的工具包;Java ME 主要用于面向消費(fèi)電子產(chǎn)品,是使 Java 程序能夠在手機(jī)、機(jī)頂盒、PDA
等產(chǎn)品上運(yùn)行的開發(fā)工具包。本書主要介紹 Java SE。圖 1-2 是 Java SE 基本結(jié)構(gòu)的示意圖。
圖 1-2 Java SE 基本結(jié)構(gòu)的示意圖
10
Java 程序設(shè)計(jì)基礎(chǔ)
從圖 1-2 中可以看出,JDK 包含了所有編譯、調(diào)試、運(yùn)行 Java 程序所需要的工具,由 JRE
和開發(fā)工具組成。JDK 中的開發(fā)工具主要包括 Java 編譯器、Java 調(diào)試器、常用于遠(yuǎn)程調(diào)試的
JPDA(Java Platform Debugger Architecture,Java 平臺(tái)調(diào)試架構(gòu)),以及用于從 Java 源代碼中抽
取注釋以生成 API 幫助文檔的 Java API 文檔生成器。
JRE 是 Java 的運(yùn)行環(huán)境,由 JVM 加上 Java API 以及其他一些支持組件構(gòu)成,用于運(yùn)行 Java
程序。其中具體表現(xiàn)形式是 Java 的類庫,是編程時(shí)可以利用的預(yù)編寫的代碼,主要包括核心
API(如端口類庫、工具類庫、I/O 類庫等)、集成類庫(如數(shù)據(jù)互聯(lián)的類庫等)以及用戶接口
(如用戶圖形界面類庫、圖形類庫等),支持組件主要包括從 Web 下載運(yùn)行 Java 應(yīng)用程序的 Java
Web Start 軟件以及用于支持 Java Applet 在瀏覽器中運(yùn)行的 Java Plug-in 軟件。
JVM 負(fù)責(zé)解釋 Java 的字節(jié)碼,以便計(jì)算機(jī)能夠加以執(zhí)行,是 Java 平臺(tái)核心。JVM 模擬了
計(jì)算機(jī)的硬件,如處理器、堆棧、寄存器等,還具有相應(yīng)的指令系統(tǒng)。JVM 只能執(zhí)行 Java 字節(jié)
碼文件(.class 文件)。
下面具體介紹 JDK 環(huán)境搭建過程。在使用 Java 之前,需要先安裝 JDK。一般要求 JDK 1.2
或以上版本,推薦使用 JDK 1.4 及以上版本。
1.JDK 的下載和安裝
JDK 的最新版本可以在 http://www.oracle.com/technetwork/java/javase/downloads/index.html 網(wǎng)
站上下載,下載時(shí)要注意自己計(jì)算機(jī)的操作系統(tǒng)類型以及操作系統(tǒng)的位數(shù),下載的安裝程序應(yīng)
當(dāng)與計(jì)算機(jī)的操作系統(tǒng)相匹配。這里介紹 JDK 8.0 版本,64 位的 Windows 環(huán)境下安裝文件的文
件名為 jdk-8u141-windows-x64.exe。
具體安裝步驟如下:
① 雙擊安裝文件 jdk-8u141-windows-x64.exe,安裝程序在收集系統(tǒng)信息之后,會(huì)彈出 JDK
安裝向?qū)?,如圖 1-3 所示。
② 單擊“下一步”按鈕,系統(tǒng)默認(rèn)將 JDK 安裝到 C:\\Program Files\\Java\\jdk1.8.0_141\\目錄
下。用戶可以不使用默認(rèn)的安裝路徑,通過單擊“更改”按鈕,可以改變安裝路徑,例如改成
D:\\Java\\jdk1.8.0_141\\。如果用戶更改了 JDK 的安裝路徑,要注意記住這個(gè)路徑,在以后應(yīng)一直
使用這個(gè)路徑。圖 1-4 是修改過 JDK 安裝路徑的向?qū)Ы缑妗?/p>
圖 1-3 JDK 安裝向?qū)?圖 1-4 修改過 JDK 安裝路徑的向?qū)Ы缑?/p>
11
第 1 章 Java 概述
③ 單擊“下一步”按鈕,安裝程序會(huì)自動(dòng)在指定目錄下安裝 JDK。安裝完成后,向?qū)Ю^
續(xù)提示安裝 JRE。JRE 的默認(rèn)安裝路徑是 C:\\Program Files\\Java\\jre1.8.0_141\\,用戶可以單擊“更
改”按鈕改變 JRE 的安裝路徑,例如改成 D:\\Java\\jre1.8.0_141\\。圖 1-5 是修改過 JRE 安裝路
徑的向?qū)Ы缑妗?/p>
④ 單擊“下一步”按鈕,繼續(xù)安裝 JRE。安裝完成后,單擊“完成”按鈕即可。本書中
JDK 和 JRE 采用的目錄都是 D:\\Java\\。圖 1-6 所示是安裝成功之后的目錄結(jié)構(gòu)圖。
圖 1-5 修改過 JRE 安裝路徑的向?qū)Ы缑?圖 1-6 目錄結(jié)構(gòu)圖
2.JDK 的環(huán)境變量設(shè)置
JDK 安裝完成之后,還需要設(shè)置計(jì)算機(jī)系統(tǒng)的環(huán)境變量中運(yùn)行路徑(Path)和類路徑(classpath),
以便其他軟件能夠確定 JDK 的安裝位置。運(yùn)行路徑變量記錄 JDK 各個(gè)命令程序所在的路徑,系統(tǒng)
根據(jù)這個(gè)變量的值來査找相應(yīng)命令程序。因此,在運(yùn)行路徑變量中加上 JDK 命令程序所在的路徑,
JDK 的命令程序都放在\\bin 目錄下(見圖 1-6)。例如,對(duì)于安裝在 D:\\Java\\jdk1.8.0_141\\目錄下的
JDK 來說,運(yùn)行路徑變量的值應(yīng)該設(shè)置 D:\\Java\\jdk1.8.0_141\\bin,這樣,在運(yùn)行 JDK 命令程序
時(shí)就不必輸入路徑名了。
類路徑變量用來記錄用戶定義的類和第三方定義的類所在的路徑,通常將類路徑設(shè)為當(dāng)前
路徑(用“.”表示)。當(dāng)運(yùn)行路徑和類路徑變量有多個(gè)值(多個(gè)路徑)時(shí),相鄰兩個(gè)路徑之間
用分號(hào)(Windows 操作系統(tǒng))或者冒號(hào)(Linux 或 UNIX 操作系統(tǒng))隔開。
以下以 Windows 7 操作系統(tǒng)環(huán)境為例,說明 JDK 環(huán)境變量的設(shè)置步驟。
① 右擊桌面上的“計(jì)算機(jī)”圖標(biāo),選擇快捷菜單中的“屬性”命令,打開“系統(tǒng)屬性”
對(duì)話框;或者選擇“開始”菜單中的“控制面板”命令,打開“控制面板”窗口,雙擊其中的
“系統(tǒng)”圖標(biāo),也可以打開“系統(tǒng)屬性”對(duì)話框。選擇“高級(jí)”選項(xiàng)卡,如圖 1-7 所示。
② 單擊“環(huán)境變量”按鈕,打開“環(huán)境變量”對(duì)話框,如圖 1-8 所示。“環(huán)境變量”對(duì)
話框分成上下兩部分,上半部分用來設(shè)置只對(duì)當(dāng)前用戶有效的用戶變量,下半部分用來設(shè)置對(duì)
所有用戶都有效的系統(tǒng)變量。
③ 單擊“系統(tǒng)變量”中的“新建”按鈕,打開“新建系統(tǒng)變量”對(duì)話框,按照如圖 1-9
所 示 填 寫 , 變 量 名 為 JAVA_HOME, 變 量 值 為 D:\\Java\\jdk1.8.0_141 。 設(shè) 置 新 的 系 統(tǒng) 變 量
JAVA_HOME 的作用是方便使用,后期如需要更新其他版本只需要安裝后修改 JAVA_HOME 變
12
Java 程序設(shè)計(jì)基礎(chǔ)
量即可。(不需要修改 path 路徑,path 路徑其中配置的系統(tǒng)路徑參數(shù)很多,配置 JAVA_HOME
可以避免產(chǎn)生錯(cuò)誤。)
圖 1-7 “系統(tǒng)屬性”對(duì)話框 圖 1-8 “環(huán)境變量”對(duì)話框
④ 在圖 1-8 的“系統(tǒng)變量”列表框中選擇 Path,單擊“編輯”按鈕,在彈出的“編輯系
統(tǒng)變量”對(duì)話框中的“變量值”文本框中最前面添加“%JAVA_HOME%\\bin;”,單擊“確定”
按鈕,完成運(yùn)行路徑的設(shè)置,如圖 1-10 所示。
圖 1-9 “新建系統(tǒng)變量”對(duì)話框 圖 1-10 “編輯系統(tǒng)變量”對(duì)話框
⑤ classpath 配置。classpath 配置只針對(duì) JDK 1.6 以前的版本,JDK 1.6 以及以后的版本都
不需要配置 classpath。
1.3.2 JDK 常用命令
JDK 包括了一系列用于開發(fā) Java 程序的命令,程序設(shè)計(jì)人員可以用這些命令調(diào)試和運(yùn)行
Java 程序,下面對(duì)其中的幾個(gè)主要命令進(jìn)行簡(jiǎn)單介紹。
1.Javac 編譯器
javac.exe 是 Java 程序的語言編譯器,該編譯器讀取 Java 程序源代碼文件,并將其編譯成
類文件(.class 文件)。類文件中包含有 Java 字節(jié)碼。javac 的命令行中必須指定 Java 程序源文
件,并且必須包括文件擴(kuò)展名. java。javac 命令的用法如下:
javac <選項(xiàng)> <源文件>
javac.exe 命令的常用選項(xiàng)及其含義如表 1-1 所示。
13
第 1 章 Java 概述
表 1-1 javac.exe 命令的常用選項(xiàng)及其含義
選 項(xiàng) 值 含 義
-g 生成所有調(diào)試信息,調(diào)試信息包括行號(hào)和源文件信息
-g: none 不生成任何調(diào)試信息
-nowarn 關(guān)閉警告信息,編譯器不顯示警告信息
-verbose 輸出有關(guān)編譯器正在執(zhí)行的操作的消息
-deprecation 輸出使用已過時(shí)的 API 的源位置
-classpath<路徑> 指定査找用戶類文件和注釋處理程序的路徑
-cp<路徑> 指定査找用戶類文件和注釋處理程序的路徑
-processorpath<路徑> 指定査找注釋處理程序的路徑
-d<目錄> 指定存放生成的類文件的位置
-s<目錄> 指定存放生成的源文件的位置
-encoding<編碼> 指定源文件使用的字符編碼
-help 輸出本命令選項(xiàng)的幫助信息
2.Java 解釋器
java. exe 是 Java 語言的解釋器,用來解釋執(zhí)行 Java 字節(jié)碼文件。用于執(zhí)行. class 文件的語
法是:
java[選項(xiàng)] class 文件名[參數(shù)...]
其中,class 文件名是以. class 為擴(kuò)展名的 Java 字節(jié)碼文件。與 javac. exe 命令不同,java 命令
行中只需指明字節(jié)碼文件名即可,不必再寫擴(kuò)展名. class。 參數(shù)是要傳給類中 main() 方法的,
多個(gè)參數(shù)用空格分隔。
java.exe 還可以執(zhí)行擴(kuò)展名為. jar 的可執(zhí)行 Java 歸檔文件(Java Archive File),用法如下:
java[-選項(xiàng)]-jar JAR 文件名[參數(shù)...]
其中,JAR 文件為以. jar 為擴(kuò)展名的可執(zhí)行 Java 歸檔文件,參數(shù)是要傳給類中 main()方法的參
數(shù),多個(gè)參數(shù)用空格分隔 。
java. exe 命令的常用選項(xiàng)及其含義如表 1-2 所示。
表 1-2 java.exe 命令的常用選項(xiàng)及其含義
選 項(xiàng) 值 含 義
-verbose 輸出有關(guān)編譯器正在執(zhí)行操作的消息,包括被編譯的源文件名和被加載的類名
-classpath<路徑> 指定査找用戶類文件和 JAR 文件的路徑
-cp<路徑> 指定査找用戶類文件和 JAR 文件的路徑
-version 顯示 Java 版本,程序不再運(yùn)行
-showversion 顯示 Java 版本,程序繼續(xù)運(yùn)行
-help 輸出命令選項(xiàng)的幫助信息
-? 輸出命令選項(xiàng)的幫助信息
14
Java 程序設(shè)計(jì)基礎(chǔ)
3.Java 歸檔文件生成器
JVM 除了可以運(yùn)行擴(kuò)展名為.c1ass 文件外,還可以運(yùn)行擴(kuò)展名為.jar 文件的可執(zhí)行的 JAR
(Java Archive File)文件。JAR 文件是一種壓縮格式的文件,它可以將一個(gè)應(yīng)用程序所涉及的多
個(gè). class 文件及其相關(guān)的信息(如目錄、運(yùn)行需要的類庫等)打包成一個(gè)文件,從而提高了 Java
程序的便攜性。JAR 文件通常用來發(fā)布 Java 應(yīng)用程序和類庫。
JDK 中的 jar. exe 命令負(fù)責(zé)生成 JAR 文件,其用法是:
Jar {ctxui 參數(shù)} [vfm0Me 參數(shù)] [JAR 文件] [manifest 文件] [應(yīng)用程序入口點(diǎn)] [-C 目錄]
文件名...
jar.exe 命令中常用參數(shù)在這里不再詳細(xì)說明。
除以上命令外,JDK 還提供多種工具,包括 Java Applet 查看器(appletViewer.exe)、Javah
頭文件生成器(javah.exe)、Java 反編譯器(javap.exe)、JDB 調(diào)試器(jdb.exe)、Java API 文
件生成器(javadoc.exe)等,這里不再一一介紹。
4.應(yīng)用程序示例
以下用一個(gè)簡(jiǎn)單例子來說明 Java 應(yīng)用程序編譯、執(zhí)行的過程。
【例 1.1】一個(gè)簡(jiǎn)單的 Java 應(yīng)用程序。
/*First Java program*/
public class WelcomeToJava {
public static void main(String[] args) {
System.out.println("Welcome to JAVA. ");
}
}
(1)編輯源程序
JDK 本身沒有提供編輯工具,可以使用任何第三方文本編輯器,例如使用 Windows 的記事
本程序,輸入例 1.1 的代碼。例 1.1 是一個(gè)比較簡(jiǎn)單的 Java 應(yīng)用程序,其中:
第 1 行“/*...*/”引導(dǎo)的內(nèi)容是 Java 的注釋信息。Java 編譯器在編譯過程中會(huì)忽略程序注
釋的內(nèi)容,在程序使用注釋時(shí),能夠增加程序的可讀性。
第 2 行是類的定義,保留字 class 用來定義一個(gè)新的類,其類名為 WelcomeToJava,class
前面的保留字 public 是修飾符,說明這個(gè)類是一個(gè)公共類,整個(gè)類的定義由花括號(hào){}括起來(即
第 2 行最后的“{”和第 6 行的“}”),其內(nèi)部是類體。
第 3 行定義了一個(gè) main()方法,這是 Java 應(yīng)用程序必須定義的一個(gè)特殊方法,是程序的
入口。其中,public 表示訪問權(quán)限,指明可以從本類的外部調(diào)用這一方法; static 指明該方法
是一個(gè)類方法,它屬于類本身,而不與某個(gè)具體對(duì)象相關(guān)聯(lián); void 指明 main()方法不返回任何
值。main()方法也用花括號(hào){}括起(即第 3 行最后的“{”和第 5 行的“}”)。
第 4 行 System.out. println("Welcome to JAVA.")實(shí)現(xiàn)程序的輸出,這條語句調(diào)用了 System 類
的標(biāo)準(zhǔn)輸出流 out 的 println()方法,該方法的作用是將圓括號(hào)內(nèi)的字符串在屏幕上輸出,并換
行。System 類位于 Java 類庫的 java. lang 包中。
這條語句的功能是在標(biāo)準(zhǔn)輸出設(shè)備(顯示器)上輸出一行字符:
Welcome to JAVA.
15
第 1 章 Java 概述
程序編輯結(jié)束,也就是輸入結(jié)束后,保存文件,并將文件命名為 WelcomeToJava. java,這
里假定文件保存在 D: \\ Java\\Program 目錄下。注意,文件名必須與類名相同(字母的大小寫也
要一致)。至此,Java 源程序編輯完畢。利用 Windows 資源管理器,可以在 D: \\ Java\\Program
目錄下看到 WelcomeToJava. java 文件。
(2)編譯源程序
使用 javac 命令對(duì)源程序進(jìn)行編譯,將 Java 源程序轉(zhuǎn)換成字節(jié)碼。
單擊“開始”→“所有程序”→“附件”→“命令提示符”命令,打開“命令提示符”窗
口,進(jìn)入 D: \\ Java\\Program,并輸入 javac WelcomeToJava. Java,按【Enter】鍵后看到圖 1-11 所
示窗口,表明編譯成功。這時(shí),D:\\Java\\Program 目錄下會(huì)多出字節(jié)碼文件 WelcomeToJava.class。
圖 1-11 編譯成功界面
如果程序輸入有錯(cuò),假定程序第 2 行的 public 中的小寫的“p”改成大寫的“P”,則編譯
器會(huì)給出錯(cuò)誤提示,如圖 1-12 所示。這時(shí),不會(huì)生成 WelcomeToJava. class 文件。
圖 1-12 編譯失敗界面
(3)執(zhí)行程序
程序被正確編譯成字節(jié)碼后,就可以用 java 命令來執(zhí)行。在“命令提示符”窗口中輸入 java
WelcomeToJava,可以看到本程序的運(yùn)行結(jié)果,如圖 1-13 所示。
16
Java 程序設(shè)計(jì)基礎(chǔ)
圖 1-13 運(yùn)行成功界面
1.3.3 Eclipse 配置
JDK 以命令行的方式為程序開發(fā)人員提供了必要的開發(fā)工具,雖然簡(jiǎn)單,但使用起來并不
是很方便,特別是無法滿足大型 Java 應(yīng)用開發(fā)的要求。隨著 Java 的廣為流行,第三方公司開
發(fā)的 Java 語言集成開發(fā)環(huán)境(Integrated Development Environment,IDE)應(yīng)運(yùn)而生。集成開發(fā)
環(huán)境是一種提供程序開發(fā)環(huán)境的應(yīng)用程序,它將程序的編輯、編譯、調(diào)試、運(yùn)行等功能集成到
一起,并利用圖形用戶界面(GUI)來方便開發(fā)人員的操作,以提高工作效率。 IDE 是程序開
發(fā)人員必備和必會(huì)的工具。常用的 Java IDE 有 NetBeans、JBuilder、Eclipse、Visual J++、JCreator
等。本書使用 Eclipse 作為開發(fā)環(huán)境。
1998 年,美國(guó) IBM 公司整合公司的內(nèi)部研究力量,致力于開發(fā)一種通用的應(yīng)用軟件集成
開發(fā)環(huán)境。2000 年,IBM 將研發(fā)出來的系統(tǒng)命名為 Eclipse。2001 年,IBM 發(fā)布 Eclipse 1.0,
并將這套投資了 4 千萬美元的系統(tǒng)捐贈(zèng)給了開發(fā)源碼社區(qū),同時(shí),還組建了 Eclipse 聯(lián)盟,主要
任務(wù)是支持并促進(jìn) Eclipse 開源項(xiàng)目的進(jìn)一步發(fā)展。2004 年初,在 Eclipse 聯(lián)盟的基礎(chǔ)上成立了
獨(dú)立的、非營(yíng)利性的合作組織——Eclipse 基金會(huì)(Eclipse Foundation),負(fù)責(zé)對(duì) Eclipse 項(xiàng)目進(jìn)
行規(guī)劃、管理和開發(fā)。 Eclipse 基金會(huì)的網(wǎng)址是 http:// www.eclipse.org/,可在該網(wǎng)站上免費(fèi)找到
Eclipse 的各種版本和相關(guān)資源。
Eclipse 最大的特點(diǎn)是采用開放的、可擴(kuò)展的體系結(jié)構(gòu),它有三個(gè)組成部分:Eclipse 平臺(tái)(Eclipse
platform)、Java 開發(fā)工具(Java Development Toolkit,JDT)以及插件開發(fā)環(huán)境(Plug-in Development
Environment,PDE)。Eclipse 平臺(tái)是 Eclipse 的通用環(huán)境,用于集成各種插件,為插件提供集成環(huán)
境,各種插件(包括 JDT 和 PDE)通過 Eclipse 平臺(tái)運(yùn)行和發(fā)揮作用。JDT 本身是一種插件,提
供 Java 應(yīng)用程序編程接口,是 Java 程序的開發(fā)環(huán)境。 PDE 是插件的開發(fā)和測(cè)試環(huán)境,支持對(duì)插
件的開發(fā)。由此可見,Eclipse 的功能已經(jīng)遠(yuǎn)遠(yuǎn)超出了 Java 集成開發(fā)環(huán)境的范圍。事實(shí)上,Eclipse
的目標(biāo)是創(chuàng)造一個(gè)廣泛的開發(fā)平臺(tái),為集成各種開發(fā)工具(插件)提供必要服務(wù),使得開發(fā)人員能
夠?qū)⒉煌墓ぞ哒系?Eclipse 中,在一個(gè)統(tǒng)一的軟件環(huán)境下開發(fā)應(yīng)用系統(tǒng),提高工作效率。
自 Eclipse 1.0 發(fā)布以來,Eclipse 每年都有新的版本發(fā)布,從 Eclipse 3.1 版開始,除了版本
號(hào)以外,還對(duì) Eclipse 進(jìn)行了代號(hào)命名。表 1-3 列出了 Eclipse 的主要版本。
17
第 1 章 Java 概述
表 1-3 Eclipse 的主要版本
版 本 發(fā) 布 時(shí) 間 版 本 發(fā) 布 時(shí) 間
Eclipse 1.0 2001 年 11 月 7 日 Eclipse Helios(3.6) 2010 年 6 月 23 日
Eclipse 2.0 2002 年 6 月 27 日 Eclipse Indigo(3.7) 2011 年 6 月 22 日
Eclipse 2.1 2003 年 3 月 27 日 Eclipse Juno(4.2) 2012 年 6 月 27 日
Eclipse 3.0 2004 年 6 月 25 日 Eclipse Kepler(4.3) 2013 年 6 月 26 日
Eclipse IO(3.1) 2005 年 6 月 27 日 Eclipse Luna(4.4) 2014 年 6 月 25 日
Eclipse Callisto(3.2) 2006 年 6 月 29 日 Eclipse Mars(4.5) 2015 年 6 月 25 日
Eclipse Europa(3.3) 2007 年 6 月 25 Eclipse Neon(4.6) 2016 年 6 月 25 日
Eclipse Ganymede(3.4) 2008 年 6 月 17 日 Eclipse Oxygen(4.7) 2016 年 6 月 25 日
Eclipse Galileo(3.5) 2009 年 6 月 24 日
下面具體介紹 Eclipse 的安裝過程。Eclipse 用 Java 開發(fā) IDE 環(huán)境,它本身也要在 Java 虛
擬機(jī)運(yùn)行,同時(shí) Eclipse 需要使用 JDK 的編譯器,因此,運(yùn)行 Eclipse 之前,要先安裝并正確
配置 JDK。JDK 的安裝和配置在前面已經(jīng)做過介紹。
1.Eclipse 的下載和安裝
Eclipse 是開放源代碼項(xiàng)目,可以到 http://www.eclipse.org/網(wǎng)站免費(fèi)下載最新版本的 Eclipse。
這里介紹 Eclipse Oxygen 的 Eclipse IDE for Java Developers,其中 Windows 環(huán)境下安裝文件的文
件名為 eclipse-java-oxygen-R-win32-x86_64.zip。
eclipse-java-oxygen-R-win32-x86_64.zip 是綠色軟件,在下載完成后,只需要將對(duì)應(yīng)的壓縮
包文件 eclipse-java-oxygen-R-win32-x86_64.zip 解壓縮到指定位置,例如 D 盤,即可完成 Eclipse
的安裝。解壓后,在安裝目錄 D 盤下會(huì)多出一個(gè) eclipse 文件夾。其 D:\\eclipse 目錄下的文件結(jié)
構(gòu)如圖 1-14 所示。
雙擊圖 1-14 中的 eclipse.exe 文件,啟動(dòng) Eclipse,出現(xiàn) Eclipse 的啟動(dòng)畫面,如圖 1-15 所示。
圖 1-14 Eclipse 的目錄結(jié)構(gòu) 圖 1-15 Eclipse 的啟動(dòng)畫面
啟動(dòng)畫面結(jié)束后,Eclipse 彈出 Eclipse Launcher 對(duì)話框,提示用戶指定工作空間(Workspace)
的位置,如圖 1-16 所示。工作空間是指存放 Java 項(xiàng)目(Java project)的目錄,默認(rèn)值是“C:\\Documents
and Settings\\計(jì)算機(jī)用戶名\\workspace”,假定今后創(chuàng)建的 Java 項(xiàng)目都放在 D:\\Java\\Program 目錄下,
單擊 Browse 按鈕,在彈出的對(duì)話框中選擇 D:\\Java\\Program 目錄,再單擊“確定”按鈕,即可完
成工作空間的設(shè)定。單擊 Eclipse Launcher 對(duì)話框中的 Launch 按鈕,進(jìn)入 Eclipse 的歡迎界面,
如圖 1-17 所示。
18
Java 程序設(shè)計(jì)基礎(chǔ)
圖 1-16 Eclipse Launcher 對(duì)話框
圖 1-17 Eclipse 的歡迎界面
單擊 Eclipse 歡迎界面的“關(guān)閉”按鈕,關(guān)閉歡迎頁面,進(jìn)入 Eclipse 的主界面。
1.3.4 Eclipse 主界面
Eclipse 的主界面由透視圖(Perspective)組成。一個(gè)透視圖是視圖(View)、菜單、工具
欄、編輯器等的組合,用來滿足不同類型 Java 程序開發(fā)工作的需要。簡(jiǎn)單地說,透視圖提供開
發(fā)界面的布局,如圖 1-18 所示。
圖 1-18 主界面透視圖
19
第 1 章 Java 概述
以下簡(jiǎn)要介紹 Java 透視圖的主要組成部分:
1.菜單欄
菜單欄位于透視圖的最上方,包括 File(文件)、Edit(編輯)、Source(源代碼)、Refactor
(重構(gòu))、Navigate(瀏覽)、Search(搜索)、Project(項(xiàng)目)、Run(運(yùn)行)、Window(窗口)
和 Help(幫助)等菜單,每個(gè)菜單含有若干菜單項(xiàng),分別執(zhí)行不同的操作。
2.工具欄
主工具欄位于菜單欄的下方包括菜單中提供的常用操作,提供一種快捷訪問 Eclipse 功能的
方法。主工具欄中的組成部分可以定制。除主工具欄外,還有視圖工具欄和快捷工具欄。在某
些視圖中包含了視圖工具欄,列出了視圖中的主要操作??旖莨ぞ邫谠谀J(rèn)情況下位于透視圖
的最下方,可以幫助開發(fā)人員快速訪問各種視圖。
3.包資源管理器視圖
包資源管理器視圖顯示所創(chuàng)建的 Java 項(xiàng)目的層次結(jié)構(gòu),包括 Java 項(xiàng)目所在的文件夾、包
含的包(package)、每個(gè)包里含有的源文件名稱、每個(gè)源文件中包含的類及其方法等。用鼠標(biāo)
拖動(dòng)包資源管理器視圖,可以改變包資源管理器視圖的位置(其他視圖也是如此)。
4.層次結(jié)構(gòu)視圖
層次結(jié)構(gòu)視圖顯示所創(chuàng)建的 Java 源文件中類的層次結(jié)構(gòu),它由兩部分組成:一部分顯示
Java 項(xiàng)目中選定的類的層次結(jié)構(gòu);另一部分顯示該類的成員,包括成員變量和成員函數(shù)。開發(fā)
人員可以用層次結(jié)構(gòu)視圖查看 Java 項(xiàng)目中的類、子類以及父類。
5.編輯器視圖
編輯器視圖(圖 1-18 中間部分)是進(jìn)行代碼編寫和調(diào)試的核心區(qū)域,除了一般的編輯功
能以外,它還提供了豐富的編輯命令和展示方式(例如用不同的顏色顯示不同的代碼),開發(fā)
人員可以通過編輯器視圖編輯不同格式的代碼(Java、JSP、XML 等),并且可以設(shè)置程序斷點(diǎn)
等,方便程序調(diào)試。在編輯程序代碼時(shí),編輯器視圖中會(huì)隨時(shí)顯示出各種語言提示,幫助開發(fā)
人員提高代碼的編輯質(zhì)量。
6.大綱視圖
大綱視圖顯示當(dāng)前打開的文件的大綱。對(duì)應(yīng)于 Java 源文件的大綱視圖包括所有類以及類的
成員變量和成員函數(shù),開發(fā)人員可以用它來査看程序的基本結(jié)構(gòu),并且可以通過單擊視圖中的
類或成員,快速定位到編輯器視圖中程序的相應(yīng)代碼部分。
7.任務(wù)列表視圖
任務(wù)列表視圖提供了任務(wù)管理功能,開發(fā)人員可以用任務(wù)列表視圖來管理自己的工作,例
如,可以將自己要做的工作分門別類地組織起來,安排時(shí)間計(jì)劃,Eclipse 系統(tǒng)會(huì)自動(dòng)對(duì)任務(wù)進(jìn)
20
Java 程序設(shè)計(jì)基礎(chǔ)
行提醒,使開發(fā)人員對(duì)自己已經(jīng)做過的工作和沒有做的工作一目了然。
8.其他視圖
其他視圖(圖 1-18 中的左下角部分)會(huì)根據(jù)項(xiàng)目開發(fā)、運(yùn)行和調(diào)試進(jìn)程進(jìn)行顯示。常見
的視圖有問題視圖、JavaDoc 視圖、聲明視圖、控制臺(tái)視圖等,分別用于幫助開發(fā)人員査看程
序存在的問題、Java 源程序中的程序注釋、全局變量聲明、運(yùn)行結(jié)果等。
1.3.5 用 Eclipse 開發(fā) Java 應(yīng)用程序
使用 Eclipse 開發(fā) Java 應(yīng)用程序的基本步驟為:建立 Java 項(xiàng)目代碼;建立 Java 類;編寫
相應(yīng)代碼;調(diào)試和運(yùn)行;如有需要,也可以生成可運(yùn)行的 JAR 文件。
下面以 WelcomeToJava . java 為例,簡(jiǎn)要說明開發(fā)過程。
① 選擇 File→New→Java Project 命令,如圖 1-19 所示,彈出 New Java Project 對(duì)話框。
② 在 New Java Project 對(duì)話框的 Project name 文本框中填寫項(xiàng)目名稱 WelcomeToJava,如
圖 1-20 所示,此后單擊 Finish 按鈕,Eclipse 進(jìn)入 Java 透視圖,這時(shí) D:\\Java\\Program 目錄下
會(huì)多出子目錄 WelcomeToJava。
圖 1-19 新建 Java Project 的菜單操作 圖 1-20 New Java Project 對(duì)話框
③ 右擊 Package Explorer 中對(duì)應(yīng)項(xiàng)目的名稱,選擇快捷菜單中的 New→Class 命令,也就是
新建一個(gè) Java 類,如圖 1-21 所示,彈出 New Java Class 對(duì)話框。
④ 在 New Java Class 對(duì)話框中,在 Name 文本框中輸入類名 WelcomeToJava,同時(shí)選中 Which
method stubs would you like to create?下面的 public static void main(String[] args)復(fù)選框,表示要自
動(dòng)創(chuàng)建一個(gè)主函數(shù),如圖 1-22 所示,單擊 Finish 按鈕,Eclipse 進(jìn)入 Java 透視圖并顯示出編輯
器視圖。
21
第 1 章 Java 概述
圖 1-21 新建 Java 類的菜單操作 圖 1-22 New Java Class 對(duì)話框
⑤ 編輯器視圖中輸入代碼,如圖 1-23 所示。
圖 1-23 編輯器里編寫的第一個(gè)程序代碼
⑥ 選擇 Run→Run As→Java Project 命令,Eclipse 提示保存資源,單擊 OK 按鈕,源程序
WelcomeToJava。java 被保存在 D:\\Java\\Program\\WelcomeToJava \\src 目錄下,控制臺(tái)視圖會(huì)顯示
程序運(yùn)行結(jié)果,如圖 1-24 所示,表明程序運(yùn)行正確。這時(shí)在 D:\\JAVA\\ program\\WelcomeToJava
\\bin 目錄下會(huì)生成 WelcomeToJava.class 文件。如果 Java 源程序中存在錯(cuò)誤,控制臺(tái)視圖會(huì)給出
提示,同時(shí),問題視圖也會(huì)列出錯(cuò)誤所在。
圖 1-24 程序運(yùn)行結(jié)果
22
Java 程序設(shè)計(jì)基礎(chǔ)
小 結(jié)
本章主要介紹 Java 的歷史、Java 的特點(diǎn)、Java 運(yùn)行基本原理、Java 程序的類型、面向?qū)ο?/p>
的基本思想、面向?qū)ο蟮陌l(fā)展過程、面向?qū)ο蟮奶攸c(diǎn)、JDK 環(huán)境配置和 Eclipse 配置。
習(xí) 題
一、選擇題
1.作為 Java 應(yīng)用程序入口的 main()方法,其聲明格式是( )。
A.public static int main(String args[]) B.public static void main(String args[])
C.public void main(String args[]) D.public int main(String args[])
2.下面命令正確的是( )。
A.java AppFirst.java B.java AppFirst
C.java appfirst.class D.javac AppFirst
3.設(shè)有一個(gè) Java 小程序,源程序名為 FirstApplet.java,其 HTML 文件為 FirstApplet.html,
則運(yùn)行該小程序的命令為( )。
A.java FirstApplet B.javac FirstApplet.java
C.a(chǎn)ppletviewer FirstApplet.java D.a(chǎn)ppletviewer FirstApplet.html
4.JDK 安裝完成后,主要的命令如 javac、java 等,都存放在根目錄的( )文件夾下。
A.bin B.jre C.include D.doc
5.Java 是一種( )語言。
A.機(jī)器 B.匯編 C.面向過程的 D.面向?qū)ο蟮?/p>
6.Java 程序的最基本組成單位是( )。
A.函數(shù) B.過程 C.變量 D.類
7.在 Java 語言中,不允許使用指針體現(xiàn)出的 Java 特性是( )。
A.可移植性 B.解釋執(zhí)行 C.健壯性 D.動(dòng)態(tài)性
8.保證 Java 可移植性的特征是( )。
A.面向?qū)ο?B.安全性 C.分布式計(jì)算 D.可跨平臺(tái)
9.Java 語言中負(fù)責(zé)并發(fā)管理的機(jī)制是( )。
A.垃圾回收 B.虛擬機(jī) C.代碼安全 D.多線程
10.下列關(guān)于字節(jié)碼的說法不正確的是( )。
A.字節(jié)碼是一種二進(jìn)制文件
B.可以看作虛擬機(jī)的機(jī)器碼
C.可以直接在操作系統(tǒng)上運(yùn)行
D.Java 程序首先由編譯器轉(zhuǎn)換為標(biāo)準(zhǔn)字節(jié)碼
11.程序的執(zhí)行過程中用到一套 JDK 工具,其中 javac. exe 是指( )。
23
第 1 章 Java 概述
A.Java 編譯器 B.Java 解釋器
C.Java 文檔生成器 D.Java 類分解器
12.JDK 目錄結(jié)構(gòu)中不包含( )目錄。
A.Inntpub B.bin C.demo D.lib
13.Java 語言的執(zhí)行模型是( )。
A.全編譯型 B.全解釋型
C.半編譯和半解釋 D.同腳本語言的解釋模式
二、填空題
1. 文件是由 Java 編譯器自動(dòng)生成的,它伴隨著每個(gè)類。
2.Java 源文件中最多只能有一個(gè) 類,其他類個(gè)數(shù)不限。
3.一個(gè) Java 源文件中有三個(gè)類定義,經(jīng)編譯后會(huì)生成 個(gè)字節(jié)碼文件。
4.Java 有兩個(gè)類型的應(yīng)用程序,它們是 和 。
5.Java API 中的工具包是 。
6.每個(gè) Java 應(yīng)用程序可以包含許多方法,但必須有且只能有一個(gè) 方法。
三、簡(jiǎn)答題
1.Java 語言有哪些特點(diǎn)?
2.JDK 安裝完成后,如何設(shè)置環(huán)境變量?
3.簡(jiǎn)述 Java 應(yīng)用程序和小應(yīng)用程序的區(qū)別。
4.簡(jiǎn)述 Java 應(yīng)用程序的開發(fā)過程。
24
Java 程序設(shè)計(jì)基礎(chǔ)
基本語法是所有編程語言的基礎(chǔ)知識(shí),也是程序代碼不可或缺的重要組成部分。要想編寫
規(guī)范、可讀性強(qiáng)的 Java 程序,必須了解和掌握 Java 的基本語法知識(shí)。本章詳細(xì)介紹了 Java
語言基本語法的各個(gè)組成部分,主要包括標(biāo)識(shí)符、關(guān)鍵詞、Java 基本數(shù)據(jù)類型、運(yùn)算符、控制
語句和數(shù)組等。
2.1 標(biāo)識(shí)符及關(guān)鍵詞
2.1.1 標(biāo)識(shí)符
用來表示類名、變量名、方法名、類型名、數(shù)組名和文件名等的有效字符序列稱為標(biāo)識(shí)符。
簡(jiǎn)單地說,標(biāo)識(shí)符就是一個(gè)名字,它可以由編程者自由指定,但是需要遵循一定的語法規(guī)定。
Java 對(duì)于標(biāo)識(shí)符的定義有如下的規(guī)定:
① 標(biāo)識(shí)符可以由字母、數(shù)字和兩個(gè)特殊字符下畫線“_”、美元符號(hào)“$”組合而成,并
且標(biāo)識(shí)符的長(zhǎng)度不受限制。
② 標(biāo)識(shí)符必須以字母、下畫線或美元符號(hào)開頭。
③ 不能把關(guān)鍵詞和保留字作為標(biāo)識(shí)符。
這里要注意兩點(diǎn):一是 Java 區(qū)分大小寫,varname 和 Varname 分別代表不同的標(biāo)識(shí)符;二
是 Java 使用 Unicode 國(guó)際標(biāo)準(zhǔn)字符集,故標(biāo)識(shí)符中的字母還可能是漢字、日文片假名、平假
名和朝鮮文等。
Java 除了對(duì)標(biāo)識(shí)符的語法規(guī)則作了定義,還對(duì)標(biāo)識(shí)符的命名風(fēng)格作了如下約定:
①“_”和“$”不作為變量名、方法名的開頭,因?yàn)檫@兩個(gè)字符對(duì)于內(nèi)部類具有特殊意義。
② 變量名、方法名首單詞小寫,其余單詞只有首字母大寫,例如 JavaClass。而接口名、
類名首單詞第一個(gè)字母要大寫,例如 JavaClass。
③ 常量名完全大寫,并且用“_”作為標(biāo)識(shí)符中各個(gè)單詞的分隔符,例如:FIRST_NAME。
④ 方法名應(yīng)使用動(dòng)詞,類名與接口名應(yīng)使用名詞。例如:
class JavaClass //定義一個(gè)類
interface JavaInterface //定義一個(gè)接口
javaMethod() //方法名稱
標(biāo)識(shí)符應(yīng)能一定程度上反映它所表示的變量、常量、對(duì)象或類的意義。因此,變量名盡量
不用單個(gè)字符,但臨時(shí)變量如控制循環(huán)變量可以用 m、i、j 等。
第2章 Java基本語法知識(shí)
25
第 2 章 Java 基本語法知識(shí)
2.1.2 關(guān)鍵詞
Java 中一些被賦予特定含義用作專門用途的字符序列稱為關(guān)鍵詞,包括:
① 數(shù)據(jù)類型:boolean、byte、short、int、long、double、char、float。
② 包引入和包聲明:import、package。
③ 用于類和接口的聲明:class、extends、implements、interface。
④ 流程控制:if、else、switch、do、while、case、break、continue、return、default、for。
⑤ 異常處理:try、catch、finally、throw、throws。
⑥ 修飾符:abstract、final、native、private、protected、public、static、synchronized、transient、
volatile。
⑦ 其他:new、instanceof、this、super、void、assert、const、enum、goto、strictfp。
關(guān)鍵詞 const 和 goto 被保留但不被使用。關(guān)鍵詞 assert 是由 Java2 的 1.4 版本添加的。除了關(guān)
鍵詞外,Java 還保留了下面幾個(gè)字:true、false 和 null,這是 Java 定義的值,不能作為標(biāo)識(shí)符。
2.1.3 語句及注釋
1.語句與語句塊
Java 中以“;”為語句的分隔符。一行內(nèi)可以寫若干語句,一個(gè)語句可寫在連續(xù)的若干行。
例如:
a=c+d;e=3+d;g=7+f;
System.out.println("Welcome to JAVA.");
2.注釋
注釋是程序不可少的部分,Java 中有三種注釋。
① 行注釋符“//”,表示從“//”開始到行尾都是注釋文字。
② 塊注釋符/ *...*/,注釋一行或多行,表示“/ *”和“* /”之間的所有內(nèi)容都是注釋。
③ 文檔注釋符/**...* /,表示“/**”和“* /”之間的文本將自動(dòng)包含在用 javadoc 命令生
成的 HTML 文件中。
2.2 數(shù) 據(jù) 類 型
Java 是一種強(qiáng)類型語言,這意味著每個(gè)變量和表達(dá)式都有一個(gè)類型,每個(gè)類型都被嚴(yán)格定
義,而且所有的賦值語句(不管是顯式賦值的還是通過參數(shù)在方法調(diào)用中傳遞的)都要經(jīng)過類
型兼容性檢査。在 Java 中沒有沖突類型的自動(dòng)轉(zhuǎn)換,編譯器檢查所有表達(dá)式和參數(shù)以保證類型
是兼容的,任何類型的不匹配都是錯(cuò)誤的,必須在編譯器編譯之前更正。Java 的數(shù)據(jù)類型只有
兩類:基本數(shù)據(jù)類型與引用數(shù)據(jù)類型。
2.2.1 基本數(shù)據(jù)類型
基本數(shù)據(jù)類型有 4 種,共 8 個(gè)。
26
Java 程序設(shè)計(jì)基礎(chǔ)
① 整型:包括 byte、short、int 和 long,用于整數(shù)值的有符號(hào)數(shù)字。
② 浮點(diǎn)型:包括 float 和 double,表示帶有小數(shù)的數(shù)字。
③ 字符:包括 char,表示在一個(gè)字符系列中的符號(hào),如字母和數(shù)字。
④ 布爾型:包括 boolean,它是一個(gè)表示真/假的特殊類型。
所有基本數(shù)據(jù)類型的大?。ㄋ加玫淖止?jié)數(shù))都已明確規(guī)定好,在各種不同的平臺(tái)上都
保持一致,這一特性有助于提高 Java 程序的可移植性。各個(gè)基本數(shù)據(jù)類型的大小及取值范圍
如表 2-1 所示。
表 2-1 基本數(shù)據(jù)類型定義表
數(shù) 據(jù) 類 型 關(guān) 鍵 詞 占 用 位 數(shù) 默 認(rèn) 數(shù) 值 取 值 范 圍
字節(jié)型 byte 8 0 -128~127
短整型 short 16 0 -32 768~32 767
整型 int 32 0 -2 147 483 648~2 147 483 647
長(zhǎng)整型 long 64 0
-9 223 372 036 854 775 808~
9 223 372 036 854 775 807
浮點(diǎn)型 float 32 0. 0F
1. 401 298 464 324 817 07e-45~
3. 402 823 466 385 288 60e+38
雙精度型 double 64 0. 0D
4. 940 656 458 412 465 44e-324~
1. 797 693 134 862 315 70e+308d
字符型 char 16 '\\u 0000' '\\u 0000'~'\\u FFFF'
布爾型 boolean 8 false true、false
2.2.2 引用數(shù)據(jù)類型
基本數(shù)據(jù)類型并不是對(duì)象層次的一部分,它們只能以傳值的方式傳遞,不能直接通過引用
來傳遞。 同樣,也無法做到多個(gè)方法引用同一個(gè)數(shù)據(jù)類型的實(shí)例。因此,Java 中對(duì)應(yīng)每一個(gè)基
本數(shù)據(jù)類型,都有一個(gè)類來包裝它。例如,對(duì)應(yīng)基本的 double 類型,還存在一個(gè)類 Double。 這
些類在包含基本數(shù)據(jù)類型所表示的一定范圍、一定格式數(shù)值的同時(shí),還包含了一些特定的方法,
可以實(shí)現(xiàn)對(duì)數(shù)值的專門操作,如把字符串轉(zhuǎn)換程成雙精度數(shù)組等。
所以,除了基本數(shù)據(jù)類型外,還有一種數(shù)據(jù)類型就是引用數(shù)據(jù)類型,例如,類、接口、數(shù)
組和字符串等。這些將在后面的章節(jié)中詳細(xì)介紹。
2.3 常量與變量
2.3.1 常量
所謂常量,是指在程序運(yùn)行的整個(gè)過程中其值始終不可以改變的量。Java 中的常量有布爾
常量、整型常量、浮點(diǎn)常量、字符常量、字符串常量。
27
第 2 章 Java 基本語法知識(shí)
1.布爾常量
布爾常量只有兩個(gè):true 和 false,分別代表真和假。
2.整型常量
整型常量即以數(shù)碼形式出現(xiàn)的整數(shù),包括正整數(shù)、負(fù)整數(shù)和 0,可以采用十進(jìn)制、八進(jìn)制
和十六進(jìn)制表示。十進(jìn)制的整型常量用非 0 開頭的數(shù)值表示,如 54、-1121;八進(jìn)制的整型常
量用 0 開頭的數(shù)字表示,如 012 代表十進(jìn)制數(shù)字 10;十六進(jìn)制整型常量以 0x 開頭的數(shù)字表示,
如 0x12 代表十進(jìn)制的數(shù)字 18。整型常量按照所占用內(nèi)存長(zhǎng)度,又可分為一般整型常量和長(zhǎng)整
型常量,其中,一般整型常量占用 32 位,長(zhǎng)整型常量占用 64 位。長(zhǎng)整型常量尾部有一個(gè)后綴
字母 L(或 l),如 887L、0x676l。
3.浮點(diǎn)常量
浮點(diǎn)常量表示的是可以含有小數(shù)部分的數(shù)值常量。根據(jù)占用內(nèi)存長(zhǎng)度的不同,可以分為一
般浮點(diǎn)常量和雙精度浮點(diǎn)常量?jī)煞N。一般浮點(diǎn)常量占用 32 位內(nèi)存,用 F(或 f)做后綴,如
43.4F、3.14f;雙精度浮點(diǎn)常量占用 64 位內(nèi)存,用帶 D(或 d)或不加后綴的數(shù)值表示,如 15.77d、
3.14159。與其他高級(jí)語言類似,浮點(diǎn)常量還有一般表示法和指數(shù)表示法兩種不同的表示方法,
如 3.1467E-5D、4.565E3f。
4.字符常量
字符常量是單引號(hào)括起來的一個(gè)字符。Java 采用 16 位的
Unicode 字符集,所有可見的 ASCII 字符都可以作為字符常量,
如'a'、'2'、'@'。此外,字符常量還可以是轉(zhuǎn)義字符。轉(zhuǎn)義字符
是一些有特殊含義、很難用一般方式表達(dá)的字符,如回車符、
換行符等。為了表達(dá)清楚這些特殊字,Java 中引入了一些特別
的定義。所有的轉(zhuǎn)義字符都用'\\'開頭,后面跟著一個(gè)字符來表
示某個(gè)特定的轉(zhuǎn)義字符,如表 2-2 所示。
表 2-2 中,'\\ddd'是用八進(jìn)制表示一個(gè)字符常量,'\\uxxxx'
是用十六進(jìn)制表示字符常量。
例如,八進(jìn)制'\\101'、十六進(jìn)制'\G '和' A'表示的是同一
個(gè)字符,作為常量它們是相同的。需要注意的是,八進(jìn)制表示
法只能表示'\\000'~'\\377'范圍內(nèi)的字符,即不能表示全部的
Unicode 字符,只能表示其中 ASCII 字符集的部分。
5.字符串常量
字符串常量是用雙引號(hào)括起的一串若干字符(可以是 0 個(gè)),可以包括轉(zhuǎn)義字符和八進(jìn)制/
十六進(jìn)制符號(hào)。Java 中標(biāo)志字符串開始和結(jié)束的雙引號(hào)必須在源代碼的同一行上。下面列舉幾
個(gè)字符串常量的例子:"good"、"you are a good man?"、"this\
Java"、" "。在 Java 中可以使用連
表 2-2 轉(zhuǎn)義字符表
引 用 方 法 功 能
\\b 退格
\\t 水平制表符 Tab
\
換行
\\f 換頁
\
回車
\\" 雙引號(hào)
\\' 單引號(hào)
\\\\ 反斜杠
\\ddd 八進(jìn)制字符常量表示
\\uxxxx 十六進(jìn)制字符常量表示
28
Java 程序設(shè)計(jì)基礎(chǔ)
接操作符“+”把兩個(gè)或更多的字符串常量串接在一起,組成一個(gè)更長(zhǎng)的字符串。例如,"我是
中國(guó)人"+"\
"的結(jié)果是"我是中國(guó)人\
"。需要注意的是,在 C/C++中字符串是作為字符數(shù)組實(shí)現(xiàn)
的,而 Java 中字符串是作為對(duì)象實(shí)現(xiàn)的。Java 包含大量的字符串處理功能,這些功能非常強(qiáng)大
且易于使用。
2.3.2 變量
1.變量的定義與聲明
在 Java 程序中變量是最基本的存儲(chǔ)單元。變量必須先聲明后使用,聲明時(shí)要指明變量的數(shù)
據(jù)類型和變量名稱,必要時(shí)還可以指定變量的初值。下面是幾個(gè)變量聲明的例子:
int x=432;
char c='u';
int i=1,k=3,j;
float f=3.14f;
String s="中國(guó)人";
Circle c; //Circle 為自定義的類,c 為該類的一個(gè)對(duì)象引用
需要注意的是,類變量的初始值是系統(tǒng)自動(dòng)進(jìn)初始化的,而局部變量必須在使用前由用戶
顯式地對(duì)初值進(jìn)行初始化,否則編譯器就會(huì)產(chǎn)生編譯錯(cuò)誤。
2.變量類型
Java 中的數(shù)據(jù)類型分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型兩種,相應(yīng)的,變量也有基本類型和
引用類型兩種。前面介紹的 8 種基本類型的變量稱為基本類型變量,而類、接口、數(shù)組、字符
串都是引用數(shù)據(jù)類型變量。這兩種數(shù)據(jù)類型變量的結(jié)構(gòu)和含義不同,系統(tǒng)對(duì)它們的處理也不同。
基本數(shù)據(jù)類型在變量聲明時(shí),系統(tǒng)直接給它分配了數(shù)據(jù)空間,空間中存放的就是初始化的
數(shù)值。例如,int a=55 的內(nèi)存分配如圖 2-1(a)所示。引用類型變量在聲明時(shí),系統(tǒng)只給它分
配一個(gè)引用空間,而沒有分配數(shù)據(jù)空間。因此,引用類型變量聲明后不能直接引用,必須通過
實(shí)例化開辟數(shù)據(jù)空間,才能夠?qū)ψ兞克赶虻?/p>
對(duì)象進(jìn)行訪問。例如,有一個(gè)表示坐標(biāo)的類
Point,它有 x 和 y 兩個(gè)成員變量,分別表示 x
坐標(biāo)和 y 坐標(biāo),它的對(duì)象 point 創(chuàng)建和實(shí)例化
過程如下:
Point point; //聲明
point=new Point(); //賦值
系統(tǒng)執(zhí)行第一條語句,將為 point 變量分配
一個(gè)引用空間,如圖 2-1(b)所示。第二條語
句分為兩步執(zhí)行:首先執(zhí)行 new Point(),給變
量 point 開辟數(shù)據(jù)空間,如圖 2-1(c)所示,
然后執(zhí)行賦值操作,將數(shù)據(jù)空間的首地址存入
變量 point 中,如圖 2-1(d)所示。
基本數(shù)據(jù)類型的變量賦值是數(shù)值的復(fù)制,圖 2-1 基本數(shù)據(jù)類型與引用類型變量的內(nèi)存分配圖
29
第 2 章 Java 基本語法知識(shí)
而引用類型變量之間的賦值是引用的復(fù)制,不是數(shù)據(jù)的復(fù)制。例如,下面的語句執(zhí)行后,內(nèi)存
的變化如圖 2-2 所示。
int x=6,y;
y=x;
Point point1, point2;
point1=new Point();
point2=point1;
(a) (b)
圖 2-2 基本數(shù)據(jù)類型與引用類型變量的賦值內(nèi)存分配圖
3.變量的作用域
Java 中所有的變量都有一個(gè)作用域,這個(gè)作用域定義了它們的可見性和生命周期。在 Java
中,兩個(gè)主要的作用域是由類定義的作用域和由方法定義的作用域。類作用域有幾個(gè)特殊的特
性和屬性,這些特性和屬性不適用于由方法定義的作用域。關(guān)于類的作用域?qū)⒃诤竺嬗懻擃悤r(shí)
具體介紹,這里僅討論由方法定義或在方法內(nèi)定義的作用域。
由方法定義的作用域是被一對(duì)花括號(hào)括起來的語句塊,如果該方法帶有參數(shù),它們也被包
括在此方法的作用域內(nèi),因此,每開始一個(gè)新的語句塊就是在創(chuàng)建一個(gè)新的作用域,同時(shí)也決
定對(duì)于程序的其他部分哪些對(duì)象是可見的。
一般來講,作用域是可以嵌套的,外部的作用域封裝了內(nèi)部的作用域,這意味在外部作用
域內(nèi)聲明的對(duì)象對(duì)于內(nèi)部作用域的代碼來說是可見的,而內(nèi)部作用域聲明的對(duì)象對(duì)其作用域外
定義的代碼是不可見的。但是要注意,不能聲明一個(gè)與外部作用域變量同名的變量,在這方面,
Java 與 C/C++不同。
在一個(gè)語句塊內(nèi),可以在任何地方聲明變量,但是這些變量?jī)H在聲明之后才能有效。因此,
如果在一個(gè)方法的開始處聲明一個(gè)變量,對(duì)于在那個(gè)方法內(nèi)的所有代碼來說,它都是可用的。
反之,如果在一個(gè)方法的末尾處聲明一個(gè)變量,則它是無用的,因?yàn)闆]有代碼可以訪問它。
2.4 運(yùn)算符與表達(dá)式
Java 提供了豐富的運(yùn)算符環(huán)境,它的大多數(shù)運(yùn)算符可以分成下面 4 組:算術(shù)運(yùn)算符、位運(yùn)
算符、關(guān)系運(yùn)算符和邏輯運(yùn)算符。Java 也定義了一些處理特殊情況的附加運(yùn)算符。
2.4.1 算術(shù)運(yùn)算符及表達(dá)式
算術(shù)運(yùn)算是針對(duì)數(shù)值類型操作數(shù)進(jìn)行的運(yùn)算。算術(shù)運(yùn)算符根據(jù)操作數(shù)個(gè)數(shù)的不同,可以分
為雙目運(yùn)算符和單目運(yùn)算符兩種。
30
Java 程序設(shè)計(jì)基礎(chǔ)
1.雙目運(yùn)算符
有兩個(gè)操作數(shù)的運(yùn)算符稱為雙目運(yùn)算符。常用的雙目算術(shù)運(yùn)算符有 5 個(gè),如表 2-3 所示。
表 2-3 雙目算術(shù)運(yùn)算符
運(yùn) 算 符 運(yùn) 算 例 子 功 能
+ 加 a+b 求 a 與 b 相加的和
- 減 a-b 求 a 與 b 相減的差
* 乘 a*b 求 a 與 b 相乘的積
/ 除 a/b 求 a 除以 b 的商
% 取余 a%b 求 a 除以 b 所得的余數(shù)
算術(shù)運(yùn)算符的操作數(shù)必須是數(shù)字類型的,布爾類型不能使用它們,但是 char 類型可以使用
它們。這是因?yàn)椋琂ava 中的 char 類型,本質(zhì)上是 int 類型的一個(gè)子集。此外,兩個(gè)整型的數(shù)據(jù)
做除法時(shí),結(jié)果是截取商的整型部分,而小數(shù)部分被截?cái)?,如果希望保留小?shù)部分,則應(yīng)該對(duì)
除法運(yùn)算的操作數(shù)做強(qiáng)制類型轉(zhuǎn)換。例如,1/4 的結(jié)果是 0,而((float)1)/4 的結(jié)果是 0.25。還要
注意一點(diǎn),Java 中的取余運(yùn)算可以應(yīng)用于浮點(diǎn)類型和整型,而 C/C++中取余運(yùn)算只能用于整型。
2.單目運(yùn)算符
只有一個(gè)操作數(shù)的運(yùn)算符是單目運(yùn)算符。常用的單目算術(shù)運(yùn)算符有 3 個(gè),如表 2-4 所示。
表 2-4 單目算術(shù)運(yùn)算符
運(yùn) 算 符 運(yùn) 算 例 子 功 能
++ 自增 a++或++a a=a+1
-- 自減 a--或--a a=a-1
- 求相反數(shù) -a a=-a
單目運(yùn)算符中的自增和自減,其運(yùn)算符的位置可以在操作數(shù)前面,也可以在操作數(shù)后面。
當(dāng)進(jìn)行單目運(yùn)算的表達(dá)式位于一個(gè)更復(fù)雜的表達(dá)式內(nèi)部時(shí),單目運(yùn)算符的位置將決定單目運(yùn)算
與復(fù)雜表達(dá)式二者執(zhí)行的先后順序。例如下面的例子里,單目運(yùn)算符在操作數(shù)變量的前面,則
先執(zhí)行單目運(yùn)算,修改變量的值后用這個(gè)新值參與復(fù)雜表達(dá)式的運(yùn)算。
int i=5;
int j=(++i)*3;
運(yùn)算的結(jié)果是 i=6,y=18。
而在下面的例子里,由于單目運(yùn)算符放在操作數(shù)變量的后面,則先計(jì)算復(fù)雜表達(dá)式的值,
然后再修改變量的取值。
int i=5;
int j=(i++)*3;
運(yùn)算的結(jié)果是 i=6,y=15??梢?,單目運(yùn)算符的位置不同,雖然對(duì)操作數(shù)變量沒有影響,
但卻會(huì)改變整個(gè)表達(dá)式的值。
31
第 2 章 Java 基本語法知識(shí)
2.4.2 關(guān)系運(yùn)算符及表達(dá)式
關(guān)系運(yùn)算符決定一個(gè)操作數(shù)與另一個(gè)操作數(shù)之間的關(guān)系。特別地,它們可以判斷相等不相
等以及排列次序,常用的關(guān)系運(yùn)算如表 2-5 所示。
表 2-5 關(guān)系運(yùn)算符
運(yùn) 算 符 運(yùn) 算 例 子 功 能
== 等于 a == b 判斷 a 是否等于 b
!= 不等于 a ! = b 判斷 a 是否不等于 b
> 大于 a>b 判斷 a 是否大于 b
< 小于 a<b 判斷 a 是否小于 b
>= 大于等于 a>=b 判斷 a 是否大于等于 b
<= 小于等于 a<=b 判斷 a 是否小于等于 b
關(guān)系運(yùn)算的結(jié)果是布爾型量,即“真”或“假”。關(guān)系運(yùn)算符經(jīng)常使用在控制語句和各種循
環(huán)語句表達(dá)式中。 Java 中的任何類型,包括整型、浮點(diǎn)型、字符和布爾型都可以使用“==”
來比較是否相等,使用“!=”來測(cè)試是否不相等(注意,相等用兩個(gè)等號(hào)表示,一個(gè)等號(hào)表
示賦值運(yùn)算符)。僅僅數(shù)字類型可以使用關(guān)系運(yùn)算符進(jìn)行比較,即只有整數(shù)、浮點(diǎn)數(shù)和字符操
作數(shù)可以被比較大小。
2.4.3 邏輯運(yùn)算符及表達(dá)式
邏輯運(yùn)算是針對(duì)布爾數(shù)據(jù)進(jìn)行的運(yùn)算,運(yùn)算的結(jié)果仍然是布爾數(shù)據(jù)。常用的邏輯運(yùn)算符如
表 2-6 所示。
表 2-6 邏輯運(yùn)算符
運(yùn) 算 符 運(yùn) 算 例 子 運(yùn) 算 規(guī) 則
& 非簡(jiǎn)潔與 x & y x、y 都真時(shí)結(jié)果才為真
| 非簡(jiǎn)潔或 x|y x、y 都假時(shí)結(jié)果才為假
! 取反 !x x 真時(shí)為假,x 假時(shí)為真
^ 異或 x^y x、y 同真或同假時(shí)結(jié)果為假
&& 簡(jiǎn)潔與 x&&y 只要 x 為假則結(jié)果為假,不用計(jì)算 y,只有 x、y 都真時(shí)結(jié)果才為真
|| 簡(jiǎn)潔或 x||y 只要 x 為真則結(jié)果為真,不用計(jì)算 y,只有 x、y 都假時(shí)結(jié)果才為假
“&”和“|”稱為非間接運(yùn)算符,因?yàn)樵诶盟鼈冏雠c、或運(yùn)算時(shí),運(yùn)算符左右兩邊的表達(dá)
式總會(huì)被運(yùn)算執(zhí)行,然后再對(duì)兩個(gè)表達(dá)式的結(jié)果進(jìn)行與、成運(yùn)算;而在利用“&&”和“||”做
簡(jiǎn)潔運(yùn)算時(shí),運(yùn)算符右邊的表達(dá)式有可能被忽略而不執(zhí)行。例如:
int i=8,j=10;
boolean z=i>j&&i++==j--;
在計(jì)算布爾變量 z 的取值時(shí),先計(jì)算“&&”左邊的關(guān)系表達(dá)式 i>j,得結(jié)果為假,根據(jù)邏
輯與運(yùn)算的規(guī)則,只有參加與運(yùn)算的兩個(gè)表達(dá)式都為真時(shí),最后的結(jié)果才為真,所以不論“&&”
右邊的表達(dá)式結(jié)果如何,整個(gè)表達(dá)式的值都為假,右邊的表達(dá)式就不予執(zhí)行運(yùn)算了。最后三個(gè)
變量的取值分別是:i=8,j=10,z=false。
32
Java 程序設(shè)計(jì)基礎(chǔ)
如果把上面代碼中的簡(jiǎn)潔與“&&”換成非簡(jiǎn)潔與“&”,則左右兩邊的兩個(gè)表達(dá)式都會(huì)被
運(yùn)算,最后三個(gè)變量的取值分別是:i=9,j=9,z=false。
同理,對(duì)于簡(jiǎn)潔或“||”,若左邊表達(dá)式的運(yùn)算結(jié)果為真,則整個(gè)或運(yùn)算的結(jié)果一定為真,
右邊的表達(dá)式就不會(huì)再執(zhí)行運(yùn)算。
2.4.4 位運(yùn)算符及表達(dá)式
位運(yùn)算是對(duì)操作數(shù)以二進(jìn)制比特位為單位進(jìn)行的操作和運(yùn)算。參與運(yùn)算的操作數(shù)只能是 int
或 long 類型,其他數(shù)據(jù)類型參與運(yùn)算時(shí)要轉(zhuǎn)換成這兩種類型。幾種位運(yùn)算符和相應(yīng)的運(yùn)算規(guī)則
如表 2-7 所示。
表 2-7 位運(yùn)算符
運(yùn) 算 符 運(yùn) 算 例 子 運(yùn) 算 規(guī) 則
~ 按位非 ~x 將 x 按比特位取反
& 按位與 x&y 將 x 和 y 按比特位做與運(yùn)算
| 按位或 x l y 將 x 和 y 按比特位做或運(yùn)算
^ 按位異或 x^y 將 x 和 y 按比特位做異或運(yùn)算
>> 右移 x>>a x 各比特位右移 a 位
<< 左移 x<<a x 各比特位左移 a 位
>>> 不帶符號(hào)的右移 x>>>a x 各比特位右移 a 位,左邊的空位一律填 0
2.4.5 賦值運(yùn)算符及表達(dá)式
在 Java 中,賦值運(yùn)算符“=”是一個(gè)雙目運(yùn)算符,結(jié)合方向?yàn)閺挠蚁蜃?,用于將賦值符右
邊操作數(shù)的值賦給左邊的變量,且這個(gè)值是整個(gè)運(yùn)算表達(dá)式的值。若賦值運(yùn)算符兩邊的類型不
一致,且右邊操作數(shù)的類型不能自動(dòng)轉(zhuǎn)換到左邊操作數(shù)的類型時(shí),則需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
此外,Java 還規(guī)定了 11 種復(fù)合賦值運(yùn)算符,如表 2-8 所示。
表 2-8 復(fù)合賦值運(yùn)算符
運(yùn) 算 符 運(yùn) 算 例 子 功 能 等 價(jià)
+= 加法賦值 x += a x=x+a
-= 減法賦值 x -= a x=x-a
*= 乘法賦值 x *= a x=x*a
/= 除法賦值 x /= a x=x/a
%= 取余賦值 x %= a x=x %a
&= 按位(邏輯)與并賦值 x &= a x=x&a
|= 按位(邏輯)或并賦值 x |= a x=x|a
^= 按位(邏輯)異或并賦值 x ^= a x=x^a
<<= 向左移位并賦值 x<<= a x=x<< a
>>= 向右移位并賦值 x>>= a x=x>> a
>>>= 不帶符號(hào)向右移位并賦值 x>>>=a x=x>>> a
33
第 2 章 Java 基本語法知識(shí)
2.4.6 其他運(yùn)算符及表達(dá)式
1.三目條件運(yùn)算符
Java 中定義了一個(gè)特殊的三目運(yùn)算符,可以取代某些類型的 if 語句,它的用法與 C 語言中
完全相同,使用形式是 x?y:z,其規(guī)則是:先計(jì)算表達(dá)式 x,若 x 為真,則整個(gè)三目運(yùn)算的結(jié)果
為表達(dá)式 y 的值;若 x 為假,則整個(gè)運(yùn)算的結(jié)果為表達(dá)式 z 的值。例如:
int x=1;
int k=x<3?1:-1;//x<3 為真,k 的值為 1
2.括號(hào)與方括號(hào)
括號(hào)運(yùn)算符“( )”在某些情況下起到改變表達(dá)式運(yùn)算先后順序的作用,在另一些情況下代
表方法或函數(shù)的調(diào)用,它的優(yōu)先級(jí)在所有的運(yùn)算符中是最高的。方括號(hào)運(yùn)算符“[]”是數(shù)組運(yùn)
算符,它的優(yōu)先級(jí)也很高,其具體使用方法將在后面介紹。
3.對(duì)象運(yùn)算符
對(duì)象運(yùn)算符 instanceof 用來測(cè)定一個(gè)對(duì)象是否是某一個(gè)指定類或其子類的實(shí)例,如果是則
返回 true,否則返回 false。
2.4.7 運(yùn)算符的優(yōu)先級(jí)與結(jié)合性
運(yùn)算符的優(yōu)先級(jí)決定了表達(dá)式中不同運(yùn)算執(zhí)行的先后順序,如關(guān)系運(yùn)算符的優(yōu)先級(jí)高于邏
輯運(yùn)算符,x> y && !z 相當(dāng)于( x> y) && ( ! z);運(yùn)算符的結(jié)合性決定了并列的相同運(yùn)算的先后執(zhí)
行順序,如對(duì)于左結(jié)合的“+”,x+ y+ z 等價(jià)于( x+ y)+ z;對(duì)于右結(jié)合的“!”,!!x 等價(jià)于! ( ! x)。
表 2-9 列出了 Java 主要運(yùn)算符的優(yōu)先級(jí)和結(jié)合性。
表 2-9 Java 主要運(yùn)算符的優(yōu)先級(jí)和結(jié)合性
運(yùn) 算 符 優(yōu) 先 級(jí) 結(jié) 合 性
[ ] . ( ) (方法調(diào)用) 1 從左向右
! ~ ++ -- +(一目運(yùn)算)-(一目運(yùn)算) 2 從右向左
* / % 3 從左向右
+ - 4 從左向右
<< >> >>> 5 從左向右
< <= > >= instanceof 6 從左向右
== != 7 從左向右
& 8 從左向右
^ 9 從左向右
| 10 從左向右
&& 11 從左向右
|| 12 從左向右
?: 13 從右向左
= 14 從右向左
34
Java 程序設(shè)計(jì)基礎(chǔ)
2.4.8 數(shù)據(jù)類型轉(zhuǎn)換
有編程經(jīng)驗(yàn)的人都知道,將一種數(shù)據(jù)類型的值賦給另一種數(shù)據(jù)類型的變量是經(jīng)常會(huì)發(fā)生的。
這時(shí)就會(huì)涉及數(shù)據(jù)類型的轉(zhuǎn)換。如果兩種類型兼容,那么 Java 將會(huì)自動(dòng)轉(zhuǎn)換,例如把 int 型的
值賦給 long 型變量,然而,并不是所有的類型都是兼容的,既不是所有的轉(zhuǎn)換都能自動(dòng)執(zhí)行。
下面就來看看 Java 數(shù)據(jù)類型之間的轉(zhuǎn)換。
1.Java 的自動(dòng)轉(zhuǎn)換
自動(dòng)類型轉(zhuǎn)換又稱拓寬轉(zhuǎn)換(Widening Conversion),或隱式轉(zhuǎn)換。當(dāng)把一種數(shù)據(jù)類型賦給
另一種數(shù)據(jù)類型的變量時(shí),如果兩種類型是兼容的并且目標(biāo)類型比源類型大,那么就會(huì)發(fā)生自
動(dòng)類型轉(zhuǎn)換。此時(shí)要注意:byte、short、int 都是有符號(hào)的數(shù),因而自動(dòng)轉(zhuǎn)換時(shí)(如轉(zhuǎn)換到 long)
要進(jìn)行符號(hào)位擴(kuò)展;int 轉(zhuǎn)換到 float 或 long 轉(zhuǎn)換到 double,很可能會(huì)造成精度損失;byte 和 char、
byte 和 boolean、char 和 boolean 類型不兼容,不能互相轉(zhuǎn)換。
Java 中還有一種經(jīng)常發(fā)生的自動(dòng)類型轉(zhuǎn)換是表達(dá)式中類型的自動(dòng)提升。在一個(gè)表達(dá)式中,
中間值所要求的精度有時(shí)會(huì)超過操作數(shù)的范圍,為此,編譯程序在計(jì)算表達(dá)式時(shí)自動(dòng)對(duì)操作數(shù)
進(jìn)行提升。Java 定義了幾個(gè)適合表達(dá)式提升的原則:首先,所有的 byte、short 和 char 型值都
被提升為 int 型;如果表達(dá)式中有一個(gè)操作數(shù)是 long 型,則整個(gè)表達(dá)式被提升為 long 型;如果
一個(gè)操作數(shù)是 float 型,則整個(gè)表達(dá)式被提升為 float 型;如果任何一個(gè)操作數(shù)是 double 型,則
結(jié)果為 double 型。
2.Java 的強(qiáng)制轉(zhuǎn)換
盡管 Java 能夠進(jìn)行自動(dòng)轉(zhuǎn)換,但是它們并不能滿足所有的要求。例如,要把一個(gè) int 型值
賦給 byte 型變量,由于 byte 型比 int 類型小,轉(zhuǎn)換不能自動(dòng)執(zhí)行,這時(shí)就要進(jìn)行強(qiáng)制轉(zhuǎn)換。
這種轉(zhuǎn)換又稱縮小轉(zhuǎn)換(Narrowing Conversion),因?yàn)轱@式地使值變小以便它適合目標(biāo)類型。
強(qiáng)制轉(zhuǎn)換時(shí)需要注意幾個(gè)問題:大多數(shù)情況下轉(zhuǎn)換會(huì)丟失信息,當(dāng)把浮點(diǎn)值賦給整型變量時(shí)會(huì)
舍去小數(shù)部分,若整數(shù)部分?jǐn)?shù)值太大而不能適合目標(biāo)類型時(shí),那么它的值會(huì)因?yàn)閷?duì)目標(biāo)類型值
域取模而減?。籧har 型變量強(qiáng)制轉(zhuǎn)換到 short 型時(shí),將 char 型變量的兩個(gè)字節(jié)(16 位)直接
放入到 short 型中;boolean 型變量不能與任何類型轉(zhuǎn)換;byte 型變量轉(zhuǎn)換到 char 型期間自動(dòng)
轉(zhuǎn)換和強(qiáng)制轉(zhuǎn)換同時(shí)發(fā)生,其轉(zhuǎn)換過程是先將 byte 型自動(dòng)轉(zhuǎn)換到 int 型,再將 int 型強(qiáng)制轉(zhuǎn)
換到 char 型。
【例 2.1】 數(shù)據(jù)類型轉(zhuǎn)換示例。
public class DataTypeConversion{
public static void main(String[] args){
short s=56;
long l;
double d=123.5;
System.out.println("short 型向 long 型進(jìn)行自動(dòng)類型轉(zhuǎn)換-->");
l=s;
System.out.println("s="+s+"l="+ l);
System.out.println("double 型向 long 型強(qiáng)制轉(zhuǎn)換-->") ;
35
第 2 章 Java 基本語法知識(shí)
l=(long)d;
System.out.println("d="+d+"l="+l);
s=100;
l=200;
d=4.5333;
char c='c';
int i=10;
float f=44.4f;
System.out.println("以下自動(dòng)提升為 double 類型-->");
double r=(f*d)+(i/c)-(d*s);
System.out.println("(f*d)+(i/c)-(d*s)"+r);
}
}
例 2.1 的運(yùn)行結(jié)果如圖 2-3 所示。
圖 2-3 例 2.1 的運(yùn)行結(jié)果
小 結(jié)
(1)關(guān)鍵字:是某種語言賦予了特殊含義的單詞。
(2)保留字:是還沒有賦予特殊含義,但是準(zhǔn)備日后要使用的單詞。
(3)標(biāo)識(shí)符:其實(shí)就是在程序中自定義的名詞。比如類名、變量名、函數(shù)名。包含 0~9、
a~z、$、_。注意:①不可以數(shù)字開頭。②不可以使用關(guān)鍵字。
(4)常量:是在程序中的值不會(huì)變化的數(shù)據(jù)。
(5)變量:其實(shí)就是內(nèi)存中的一個(gè)存儲(chǔ)空間,用于存儲(chǔ)常量數(shù)據(jù)。
作用:方便于運(yùn)算。因?yàn)橛行?shù)據(jù)不確定。所以確定該數(shù)據(jù)的名詞和存儲(chǔ)空間。
特點(diǎn):變量空間可以重復(fù)使用。
只要是數(shù)據(jù)不確定的時(shí)候,就可以定義變量。
變量空間的開辟需要的要素:①這個(gè)空間要存儲(chǔ)什么數(shù)據(jù)?數(shù)據(jù)類型。②這個(gè)空間叫什么
名字?變量名稱。③這個(gè)空間存儲(chǔ)的第一個(gè)數(shù)據(jù)是什么? 變量的初始化值。
變量的作用域:作用域從變量定義的位置開始,到該變量所在的那對(duì)大括號(hào)結(jié)束。
(6)生命周期:①變量從定義的位置開始就在內(nèi)存中存活了。②變量到達(dá)它所在的作用域
的時(shí)候就在內(nèi)存中消失了。
(7)數(shù)據(jù)類型:
① 基本數(shù)據(jù)類型(8 種):byte、short、int、long、float、double、char、boolean。
36
Java 程序設(shè)計(jì)基礎(chǔ)
② 引用數(shù)據(jù)類型(3 種):數(shù)組、類、接口。
級(jí)別從低到高為:byte、char、short(這三個(gè)平級(jí))→int→float→long→double。
自動(dòng)類型轉(zhuǎn)換:從低級(jí)別到高級(jí)別,系統(tǒng)自動(dòng)轉(zhuǎn)換。
強(qiáng)制類型轉(zhuǎn)換:把一個(gè)高級(jí)別的數(shù)值賦給一個(gè)比該數(shù)的級(jí)別低的變量。
掌握基本的運(yùn)算符的使用原則。
習(xí) 題
一、選擇題
1.下列屬于合法的 Java 標(biāo)識(shí)符的是( )。
A."fd" B.&5d8 C.-we D.saler
2.下列代表十六進(jìn)制整數(shù)的是( )。
A.045 B.23 C.dd44 D.Ox54a
3.設(shè)“x=1,y=2,z=3”,則表達(dá)式“y+=z- -/++x”的值是( )。
A.3 B.3.5 C.4 D.4.5
4.下面程序段的輸出結(jié)果為( )。
public class Test{
public static void main(String[] args){
System.out.println(89>>1) ;
}
}
A.44 B.45 C.88 D.90
5.Java 程序書寫格式的描述中,正確的是( )。
A.不區(qū)分字母大小寫
B.一個(gè)注釋不可以分寫在多行上
C.每個(gè)語句必須以“,”作為結(jié)束符 .
D.一行中可以既包含正常的 Java 語句,又包含注釋
6.下列關(guān)于用戶標(biāo)識(shí)符的敘述中正確的是( )。
A.用戶標(biāo)識(shí)符中可以出現(xiàn)下畫線和中畫線(減號(hào))
B.用戶標(biāo)識(shí)符中不可以出現(xiàn)中畫線,但可以出現(xiàn)下畫線
C.用戶標(biāo)識(shí)符中可以出現(xiàn)下畫線,但不可以放在用戶標(biāo)識(shí)符的開頭 。
D.用戶標(biāo)識(shí)符中可以出現(xiàn)下畫線和數(shù)組,它們都可以放在用戶標(biāo)識(shí)符的開頭
7.下列說法正確的是( )。
A.單精度浮點(diǎn)型和雙精度浮點(diǎn)型的數(shù)據(jù)長(zhǎng)度一樣
B.可以對(duì)浮點(diǎn)數(shù)取模運(yùn)算
C.整型常量不能用八進(jìn)制表示,但是可以用十六進(jìn)制表示
D.實(shí)型常量只能用十進(jìn)制形式表示
8.下面標(biāo)識(shí)符中錯(cuò)誤的是( )。
37
第 2 章 Java 基本語法知識(shí)
A.Javaworld B._sum C.2Java Program D.$abc
9.下列運(yùn)算符的優(yōu)先級(jí)順序從高到低排列的是( )。
A.|、&.、! B.&、^、|| C.!、%、++ D.<、<<、++
10.下面賦值語句不會(huì)產(chǎn)生編譯錯(cuò)誤的是( )。
A.char a="abc"; B.byte b=152;
C.float c=2.0; D.double d=2.0;
11.下面是 Java 關(guān)鍵字的是( )。
A.False B.FOR C.For D.for
12.執(zhí)行下面程序后,結(jié)論正確的是( )。
int a,b,c;
a=1;b=3;c=(a+b>3?++a:b++);
A.a(chǎn) 的值為 2,b 的值為 3,c 的值為 1
B.a(chǎn) 的值為 2,b 的值為 4,c 的值為 2
C.a(chǎn) 的值為 2,b 的值為 4,c 的值為 1
D.a(chǎn) 的值為 2,b 的值為 3,c 的值為 2
13.設(shè)各個(gè)變量的定義如下,則下列選項(xiàng)的值為 true 的是( )。
int a=3,b=3;
boolean flag=true;
A.++a = = b B.++a= = b++
C.(++a = = b) || flag D.(++a= =b) & flag
14.表達(dá)式(int)6.5/7.5*3 的值的類型為( )。
A.short B.int C.double D.float
15.設(shè) a, b, x, y, z 均為 int 型變量,并已賦值,則下列表達(dá)式的結(jié)果屬于非邏輯值的是
( )。
A.x>y && b<a B.-z>x-y C.y = = ++x D.y+x*x++
16.下面語句輸出的結(jié)果為( )。
System.out.println(5^2);
A.6 B.7 C.10 D.25
17.對(duì)下面的語句執(zhí)行完后正確的說法是( )。
int c='c'/3;
System.out.println(c);
A.輸出結(jié)果為 21 B.輸出結(jié)果為 22
C.輸出結(jié)果為 32 D.輸出結(jié)果為 33
18.以下選項(xiàng)中變量 a 已定義類型,合法的賦值語句為( )。
A.a(chǎn) = int(y); B.a(chǎn)= =1; C.a(chǎn) = a+1=3; D.++a;
19.執(zhí)行下列程序段后,ch,x,y 的值正確的是( )。
int x=3,y=4;
boolean ch;
ch=x<y||++x==--y;
A.true,3,4 B.true,4,3 C.false,3,4 D.false,4,3
38
Java 程序設(shè)計(jì)基礎(chǔ)
20.下列標(biāo)識(shí)符中,正確的是( )。
A.1_Back B.$_Money C.$-money D.2-Forward
21.現(xiàn)有一個(gè) int 型的整數(shù)和一個(gè) double 型的浮點(diǎn)數(shù),當(dāng)它們之間做了加法運(yùn)算之后,得
到的結(jié)果類型應(yīng)該是( )。
A.int 型 B.double 型 C.float 型 D.long 型
22.以下程序的運(yùn)行結(jié)果為 ( )。
public class A {
public static void main(String[] args) {
int x=2,y=5;
String z="5";
System.out.println(x+y);
System.out.println(x+z+"x+z");
System.out.println("x+y="+x+y);
System.out.println("x+z="+(x+z));
}
}
A.7 B.7 C.25 D.7
25x+z 7x+z 25x+z 25x+z
x+y=25 x+y=25 x+y=7 x+y=25
x+z=25 x+z=7 x+z=25 x+z=7
23.設(shè)有定義 int a=12;,則執(zhí)行 a*=12;語句后,a 的值為( )。
A.144 B.12 C.24 D.0
24.下列標(biāo)識(shí)符中合法的是( )。
A.$#@!$ B.$我們$ C.$22$ D.2$$2
25.執(zhí)行下列程序段后,b, x, y 的值分別是( )。
int x=6,y=8;
boolean b;
b=x>y&&++x==--y;
A.true , 6, 8 B.false , 6, 8 C.e, 7, 7 D.false, 7, 7
26.下列程序的運(yùn)行結(jié)果是( )。
public class A {
public static void main(String[] args) {
int x=7%3;
while(x){
x--;
}
System.out.println(x);
}
}
A.0 B.1 C.true D.編譯錯(cuò)誤
二、填空題
1.Java 中,移位運(yùn)算符包括>>、<<和 。
39
第 2 章 Java 基本語法知識(shí)
2.如果兩個(gè)操作數(shù)全是 byte 型或 short 型,則表達(dá)式的結(jié)果為 型。
3.在 Java 提供的 4 種整型變量中, 類型表示的數(shù)據(jù)范圍最小。
4.定義并創(chuàng)建一個(gè)含有 7 個(gè) float 型元素的數(shù)組 。
5.在 Java 中,由/** 開始,以*/結(jié)束的注釋語句,可以用于生成 。
6.設(shè)有定義 int x=5;,則執(zhí)行 x+=x+5 語句后,x 的值為 。
7.Java 邏輯常量有兩個(gè): 和 。
8.寫出下列表達(dá)式的運(yùn)算結(jié)果,設(shè) a=2,b=-4,c=true。
(1)-a%b++
(2)a>=1 && a <= 10 ? a : b
(3)c^(a>b)
(4)(-a)<<a
(5)(double)(a+b)/5+a/b
9.比較兩個(gè)數(shù)相等的運(yùn)算符是 。
10.Java 中的 8 種基本數(shù)據(jù)類型分別是 char、 、 、 、 、
、 和 。
11.寫出下列程序的運(yùn)行結(jié)果。
public class Foo{
static int i=0;
static int j=0;
public static void main(String[] args){
int i=2;
int k=3;
int j=3;
System.out.println("i+j is"+i+j);
k=i+j;
System.out.println("k is"+k);
System.out.println("j is"+j);
}
}
三、編程題
聲明一個(gè) double 類型變量 d,一個(gè) float 變量 f,d 的賦值為 43.4,f 的賦值為 8.55,計(jì)算平
方和。
40
Java 程序設(shè)計(jì)基礎(chǔ)
就像有感知力的生物一樣,程序也應(yīng)該有能力操控它的世界,并且在執(zhí)行過程中作決定。
Java 的運(yùn)算符可以控制數(shù)據(jù),而決定是由 Java 的控制語句來完成的。語句是 Java 的最小執(zhí)行
單位,用于指示計(jì)算機(jī)完成某些操作。該操作完成后會(huì)把控制權(quán)轉(zhuǎn)向另外一條語句。語句不同
于表達(dá)式,它沒有值。語句間以分號(hào)(;)作為分隔符。Java 的控制語句分為順序結(jié)構(gòu)語句、選
擇結(jié)構(gòu)語句和循環(huán)結(jié)構(gòu)語句。本章將詳細(xì)介紹 Java 中的各種流程控制語句。
3.1 順序結(jié)構(gòu)語句
Java 順序結(jié)構(gòu)語句通常指書寫順序與執(zhí)行順序相同的語句。語句可以是單一的一條語句(如
x= y+ z;),也可以是用花括號(hào){}括起來的語句塊(也稱復(fù)合語句)。
3.1.1 表達(dá)式語句
在 Java 程序中,表達(dá)式往往被用于計(jì)算某種值。但當(dāng)表達(dá)式加上“;”后,它就變成了表
達(dá)式語句。
例如,下面一些表達(dá)式語句:
a=b;
int i=1;
System.out.println("good");
3.1.2 塊語句
所謂“塊”或“復(fù)合語句”,是指一對(duì)花括號(hào)“{”和“}”括起來的任意數(shù)量的語句組。
例如:
{
} //這是一個(gè)空塊
{
Car car=new Car();
car.color="Red";
} //這是一個(gè)復(fù)合語句
塊定義著變量的“作用域”。一個(gè)塊也可嵌入另一個(gè)塊內(nèi)。
例如:
public static void main(String[] args){
char c1;
第3章 Java控制語句