第1章Java開發(fā)入門
1.1Java概述
1.1.1認(rèn)識(shí)Java
1.1.2Java發(fā)展史
1.1.3Java語言的特點(diǎn)
1.2JDK的使用
1.2.1下載JDK
1.2.2安裝JDK
1.2.3配置JDK
1.2.4測(cè)試開發(fā)環(huán)境
1.2.5JDK目錄介紹
1.3第一個(gè)Java程序
1.3.1編寫Java源文件
1.3.2編譯運(yùn)行
1.3.3Java虛擬機(jī)(JVM)
1.4Java運(yùn)行流程
1.5本章小結(jié)
1.6習(xí)題
第2章Java編程基礎(chǔ)
2.1Java的基本語法
2.1.1語句和表達(dá)式
2.1.2基本格式
2.1.3注釋
2.1.4關(guān)鍵字
2.1.5進(jìn)制轉(zhuǎn)換
2.2基本數(shù)據(jù)類型
2.2.1整數(shù)類型
2.2.2浮點(diǎn)數(shù)類型
2.2.3字符類型
2.2.4布爾類型
2.3變量與常量
2.3.1標(biāo)識(shí)符
2.3.2變量的定義
2.3.3變量的類型轉(zhuǎn)換
2.3.4變量的作用域
2.3.5常量
2.4Java中的運(yùn)算符
2.4.1算術(shù)運(yùn)算符
2.4.2賦值運(yùn)算符
2.4.3關(guān)系運(yùn)算符
2.4.4邏輯運(yùn)算符
2.4.5位運(yùn)算符
2.4.6運(yùn)算符的優(yōu)先級(jí)
2.5程序的結(jié)構(gòu)
2.5.1順序結(jié)構(gòu)
2.5.2選擇結(jié)構(gòu)
2.5.3循環(huán)結(jié)構(gòu)
2.5.4循環(huán)中斷
2.6本章小結(jié)
2.7習(xí)題
第3章數(shù)組與方法
3.1數(shù)組
3.1.1數(shù)組的定義
3.1.2數(shù)組的初始化
3.1.3數(shù)組的常用操作
3.1.4數(shù)組的內(nèi)存原理
3.1.5二維數(shù)組
3.2方法
3.2.1方法的定義
3.2.2方法的調(diào)用
3.2.3方法的重載
3.2.4方法的遞歸
3.3數(shù)組的引用傳遞
3.4本章小結(jié)
3.5習(xí)題
第4章面向?qū)ο?上)
4.1面向?qū)ο蟮母拍?
4.2類與對(duì)象
4.2.1類的定義
4.2.2對(duì)象的創(chuàng)建與使用
4.2.3類的封裝
4.3構(gòu)造方法
4.3.1構(gòu)造方法的定義
4.3.2構(gòu)造方法的重載
4.4this關(guān)鍵字
4.5垃圾回收
4.6static關(guān)鍵字
4.6.1靜態(tài)變量
4.6.2靜態(tài)方法
4.6.3代碼塊
4.6.4單例模式
4.7內(nèi)部類
4.7.1成員內(nèi)部類
4.7.2靜態(tài)內(nèi)部類
4.7.3方法內(nèi)部類
4.7.4匿名內(nèi)部類
4.8本章小結(jié)
4.9習(xí)題
第5章面向?qū)ο?下)
5.1類的繼承
5.1.1繼承的概念
5.1.2重寫父類方法
5.1.3super關(guān)鍵字
5.2final關(guān)鍵字
5.2.1final關(guān)鍵字修飾類
5.2.2final關(guān)鍵字修飾方法
5.2.3final關(guān)鍵字修飾變量
5.3抽象類和接口
5.3.1抽象類
5.3.2接口
5.3.3接口的實(shí)現(xiàn)
5.3.4接口的繼承
5.3.5抽象類和接口的關(guān)系
5.4多態(tài)
5.4.1多態(tài)的概念
5.4.2對(duì)象的類型轉(zhuǎn)換
5.4.3Object類
5.4.4設(shè)計(jì)模式——工廠設(shè)計(jì)模式
5.4.5設(shè)計(jì)模式——代理設(shè)計(jì)模式
5.5包
5.5.1包的定義與使用
5.5.2import語句
5.5.3Java的常用包
5.5.4給Java應(yīng)用程序打包
5.6訪問控制
5.7本章小結(jié)
5.8習(xí)題
第6章異常
6.1異常的概念
6.2異常捕獲
6.3在方法中拋出異常
6.3.1使用throws關(guān)鍵字拋出異常
6.3.2使用throw關(guān)鍵字拋出異常
6.4Exception和Runtime Exception
6.5自定義異常
6.6斷言
6.7異常的使用原則
6.8本章小結(jié)
6.9習(xí)題
第7章多線程
7.1線程概述
7.1.1進(jìn)程
7.1.2線程
7.2線程的創(chuàng)建
7.2.1繼承Thread類創(chuàng)建線程
7.2.2實(shí)現(xiàn)Runnable接口創(chuàng)建線程
7.2.3使用Callable接口和Future接口創(chuàng)建線程
7.2.4三種實(shí)現(xiàn)多線程方式的對(duì)比分析
7.3線程的生命周期及狀態(tài)轉(zhuǎn)換
7.4線程的調(diào)度
7.4.1線程的優(yōu)先級(jí)
7.4.2線程休眠
7.4.3線程讓步
7.4.4線程插隊(duì)
7.4.5后臺(tái)線程
7.5多線程同步
7.5.1線程安全
7.5.2同步代碼塊
7.5.3同步方法
7.5.4死鎖問題
7.6多線程通信
7.7線程組和未處理的異常
7.8線程池
7.9本章小結(jié)
7.10習(xí)題
第8章Java基礎(chǔ)類庫
8.1基本類型的包裝類
8.2JDK 5.0新特性——自動(dòng)裝箱和拆箱
8.3Scanner類
8.4String類、StringBuffer類和StringBuilder類
8.4.1String類的初始化
8.4.2String類的常見操作
8.4.3StringBuffer類
8.4.4StringBuilder類
8.4.5String類對(duì)正則表達(dá)式的支持
8.5System類與Runtime類
8.5.1System類
8.5.2Runtime類
8.6Math類與Random類
8.6.1Math類
8.6.2Random類
8.7日期操作類
8.7.1Date類
8.7.2Calendar類
8.7.3DateFormat類
8.7.4SimpleDateFormat類
8.8JDK 7.0新特性——switch語句支持字符串類型
8.9本章小結(jié)
8.10習(xí)題
第9章集合類
9.1集合概述
9.2Collection接口
9.3List接口
9.3.1List接口簡(jiǎn)介
9.3.2ArrayList集合
9.3.3LinkedList實(shí)現(xiàn)類
9.3.4Iterator接口
9.3.5JDK5.0新特性——foreach循環(huán)
9.3.6ListIterator接口
9.3.7Enumeration接口
9.4Set接口
9.4.1Set接口簡(jiǎn)介
9.4.2HashSet集合
9.4.3TreeSet集合
9.5Queue接口
9.5.1Queue接口簡(jiǎn)介
9.5.2PriorityQueue實(shí)現(xiàn)類
9.5.3Deque接口與ArrayDeque實(shí)現(xiàn)類
9.6Map接口
9.6.1Map接口簡(jiǎn)介
9.6.2HashMap集合
9.6.3LinkedHashMap集合
9.6.4TreeMap集合
9.6.5Properties集合
9.7JDK 5.0新特性——泛型
9.7.1為什么使用泛型
9.7.2泛型定義
9.7.3通配符
9.7.4有界類型
9.7.5泛型的限制
9.7.6自定義泛型
9.8Collections工具類
9.9Arrays工具類
9.10集合轉(zhuǎn)換
9.11本章小結(jié)
9.12習(xí)題
第10章IO(輸入輸出)
10.1流概述
10.2字節(jié)流
10.2.1字節(jié)流的概念
10.2.2字節(jié)流讀寫文件
10.2.3文件的復(fù)制
10.2.4字節(jié)流的緩沖區(qū)
10.2.5裝飾設(shè)計(jì)模式
10.2.6字節(jié)緩沖流
10.3字符流
10.3.1字符流定義及基本用法
10.3.2字符流操作文件
10.3.3字符流的緩沖區(qū)
10.3.4LineNumberReader
10.3.5轉(zhuǎn)換流
10.4其他IO流
10.4.1ObjectInputStream和ObjectOutputStream
10.4.2DataInputStream和DataOutputStream
10.4.3PrintStream
10.4.4標(biāo)準(zhǔn)輸入輸出流
10.4.5PipedInputStream和PipedOutputStream
10.4.6ByteArrayInputStream和ByteArrayOutputStream
10.4.7CharArrayReader和CharArrayWriter
10.4.8SequenceInputStream
10.5File類
10.5.1File類的常用方法
10.5.2遍歷目錄下的文件
10.5.3文件過濾
10.5.4刪除文件及目錄
10.6RandomAccessFile
10.7字符編碼
10.7.1常用字符集
10.7.2字符編碼和解碼
10.7.3字符傳輸
10.8本章小結(jié)
10.9習(xí)題
第11章GUI(圖形用戶界面)
11.1AWT概述
11.2AWT事件處理
11.2.1事件處理機(jī)制
11.2.2事件適配器
11.2.3用匿名內(nèi)部類實(shí)現(xiàn)事件處理
11.3常用事件分類
11.3.1窗體事件
11.3.2鼠標(biāo)事件
11.3.3鍵盤事件
11.3.4動(dòng)作事件
11.4布局管理器
11.4.1FlowLayout
11.4.2BorderLayout
11.4.3GridLayout
11.4.4GridBagLayout
11.4.5CardLayout
11.4.6不使用布局管理器
11.5AWT繪圖
11.6Swing
11.6.1JFrame
11.6.2JDialog
11.6.3中間容器
11.6.4文本組件
11.6.5按鈕組件
11.6.6JComboBox
11.6.7菜單組件
11.6.8創(chuàng)建Tree
11.6.9JTable
11.7本章小結(jié)
11.8習(xí)題
第12章網(wǎng)絡(luò)編程
12.1網(wǎng)絡(luò)通信協(xié)議
12.1.1IP地址和端口號(hào)
12.1.2InetAddress
12.1.3UDP與TCP協(xié)議
12.2UDP通信
12.2.1DatagramPacket
12.2.2DatagramSocket
12.2.3UDP網(wǎng)絡(luò)程序
12.2.4UDP案例——聊天程序
12.3TCP通信
12.3.1ServerSocket
12.3.2Socket
12.3.3簡(jiǎn)單的TCP網(wǎng)絡(luò)程序
12.3.4多線程的TCP網(wǎng)絡(luò)程序
12.3.5TCP案例——文件上傳
12.4Java Applet
12.5本章小結(jié)
12.6習(xí)題
第13章Eclipse開發(fā)工具
13.1Eclipse概念
13.2Eclipse安裝與啟動(dòng)
13.2.1Eclipse工作臺(tái)
13.2.2Eclipse透視圖
13.3使用Eclipse進(jìn)行程序開發(fā)
13.3.1創(chuàng)建Java項(xiàng)目
13.3.2創(chuàng)建類文件
13.3.3編寫代碼
13.3.4運(yùn)行程序
13.4Eclipse程序調(diào)試
13.5使用Eclipse導(dǎo)出、導(dǎo)入jar文件
13.5.1Eclipse導(dǎo)出jar文件
13.5.2Eclipse導(dǎo)入jar文件
13.6本章小結(jié)
13.7習(xí)題
第3章
chapter3
數(shù)組與方法
本章學(xué)習(xí)目標(biāo)
了解Java數(shù)組的定義
掌握J(rèn)ava數(shù)組的常用操作
理解Java二維數(shù)組
掌握J(rèn)ava的方法定義與調(diào)用
掌握J(rèn)ava方法重載與遞歸
理解Java數(shù)組的引用傳遞
在開發(fā)過程中需要定義多個(gè)相同類型的變量時(shí),使用數(shù)組是一個(gè)很好的選擇。例如,要存儲(chǔ)80名學(xué)生的成績(jī),在沒有數(shù)組之前,就需要定義80個(gè)變量,很明顯這個(gè)定義的過程相當(dāng)瑣碎,耗費(fèi)時(shí)間和精力,于是Java語言提供了數(shù)組來存儲(chǔ)相同類型的數(shù)據(jù),這樣要存儲(chǔ)80名學(xué)生的成績(jī),只需一個(gè)數(shù)組就可以了。當(dāng)遇到有些代碼需要反復(fù)使用的情況時(shí),可以將代碼聲明成一個(gè)方法,以供程序反復(fù)調(diào)用。
3.1數(shù)組
數(shù)組是一種數(shù)據(jù)結(jié)構(gòu),是按一定順序排列的相同類型的元素集合。數(shù)組實(shí)際上就是一連串類型相同的變量,這些變量用一個(gè)名字命名,即數(shù)組名,并用索引區(qū)分它們。使用數(shù)組時(shí),可以通過索引來訪問數(shù)組元素,如數(shù)組元素的賦值和取值。
3.1.1數(shù)組的定義
在Java中數(shù)組是相同類型元素的集合,可以存放上千萬個(gè)數(shù)據(jù),在一個(gè)數(shù)組中,數(shù)組元素的類型是唯一的,即一個(gè)數(shù)組中只能存儲(chǔ)同一種數(shù)據(jù)類型的數(shù)據(jù),而不能存儲(chǔ)多種數(shù)據(jù)類型的數(shù)據(jù),數(shù)組一旦定義好就不可以修改長(zhǎng)度,因?yàn)閿?shù)組在內(nèi)存中所占的大小是固定的,所以數(shù)組的長(zhǎng)度不能改變,如果要修改就必須重新定義一個(gè)新數(shù)組或者引用其他的數(shù)組,因此數(shù)組的靈活性較差。
數(shù)組是可以保存一組數(shù)據(jù)的一種數(shù)據(jù)結(jié)構(gòu),它本身也會(huì)占用一個(gè)內(nèi)存地址,因此數(shù)組是引用類型。定義數(shù)組的語法格式如下:
數(shù)據(jù)類型[]數(shù)組名;
對(duì)于數(shù)組的聲明也可用另外一種形式,其語法格式如下:
數(shù)據(jù)類型數(shù)組名[];
上述兩種不同語法格式聲明的數(shù)組中,“[]”是一維數(shù)組的標(biāo)識(shí),從語法格式可見,它既可放置在數(shù)組名前面,也可以放在數(shù)組名后面。面向?qū)ο蟪绦蛟O(shè)計(jì)更側(cè)重放在前面,保留放在后面是為了迎合C程序員的使用習(xí)慣,在這里推薦使用第一種格式。下面演示不同數(shù)據(jù)類型的數(shù)組聲明,具體示例如下:
int[]a;//聲明一個(gè)int類型的數(shù)組
doubleb[];//聲明一個(gè)double類型的數(shù)組
上述示例中聲明了一個(gè)int類型的數(shù)組a與一個(gè)double類型的數(shù)組b,數(shù)組名是用來統(tǒng)一這組相同數(shù)據(jù)類型的元素名稱,數(shù)組名的命名規(guī)則和變量相同。
3.1.2數(shù)組的初始化
在Java程序開發(fā)中,使用數(shù)組之前都會(huì)對(duì)其進(jìn)行初始化,這是因?yàn)閿?shù)組是引用類型,聲明數(shù)組只是聲明了一個(gè)引用類型的變量,并不是數(shù)組對(duì)象本身,只要讓數(shù)組變量指向有效的數(shù)組對(duì)象,程序中就可使用該數(shù)組變量來訪問數(shù)組元素。所謂數(shù)組初始化,就是讓數(shù)組名指向數(shù)組對(duì)象的過程,該過程主要分為兩個(gè)步驟:一是對(duì)數(shù)組對(duì)象進(jìn)行初始化,即為數(shù)組中的元素分配內(nèi)存空間和賦值;二是對(duì)數(shù)組名進(jìn)行初始化,即將數(shù)組名賦值為數(shù)組對(duì)象的引用。
通過兩種方式可對(duì)數(shù)組進(jìn)行初始化,即靜態(tài)初始化和動(dòng)態(tài)初始化,下面演示這兩種方式的具體語法。
1.靜態(tài)初始化
靜態(tài)初始化是指由程序員在初始化數(shù)組時(shí)為數(shù)組每個(gè)元素賦值,由系統(tǒng)決定數(shù)組的長(zhǎng)度。
數(shù)組的靜態(tài)初始化有兩種方式,具體示例如下:
int[]array;//聲明一個(gè)int類型的數(shù)組
array=newint[]{1,2,3,4,5};//靜態(tài)初始化數(shù)組
int[]array=newint[]{1,2,3,4,5};//聲明并初始化數(shù)組
對(duì)于數(shù)組的靜態(tài)初始化也可簡(jiǎn)寫,具體示例如下:
int[]array={1,2,3,4,5};//聲明并初始化一個(gè)int類型的數(shù)組
上述示例中靜態(tài)初始化了數(shù)組,其中大括號(hào)包含數(shù)組元素值,元素值之間用逗號(hào)“,”分隔。此處注意,只有在定義數(shù)組的同時(shí)執(zhí)行數(shù)組初始化才支持使用簡(jiǎn)化的靜態(tài)初始化。
2.動(dòng)態(tài)初始化
動(dòng)態(tài)初始化是指由程序員在初始化數(shù)組時(shí)指定數(shù)組的長(zhǎng)度,由系統(tǒng)為數(shù)組元素分配初始值。
數(shù)組動(dòng)態(tài)初始化的具體示例如下:
int[]array=newint[10];//動(dòng)態(tài)初始化數(shù)組
上述示例會(huì)在數(shù)組聲明的同時(shí)分配一塊內(nèi)存空間供該數(shù)組使用,其中數(shù)組長(zhǎng)度是10,由于每個(gè)元素都為int型數(shù)據(jù)類型,因此上例中數(shù)組占用的內(nèi)存共有10×4=40個(gè)字節(jié)。此外,動(dòng)態(tài)初始化數(shù)組時(shí),其元素會(huì)根據(jù)它的數(shù)據(jù)類型被設(shè)置為默認(rèn)的初始值。本例數(shù)組中每個(gè)元素的默認(rèn)值為0,其他常見的數(shù)據(jù)類型默認(rèn)值如表3.1所示。
表3.1數(shù)據(jù)類型默認(rèn)值表
成員變量類型初始值成員變量類型初始值
byte0double0.0D
short0char空字符,'\u0000'
int0booleanfalse
long0L引用數(shù)據(jù)類型null
float0.0F
3.1.3數(shù)組的常用操作
1.訪問數(shù)組
在Java中,數(shù)組對(duì)象有一個(gè)length屬性,用于表示數(shù)組的長(zhǎng)度,所有類型的數(shù)組都是如此。
獲取數(shù)組長(zhǎng)度的語法格式如下:
數(shù)組名.length
接下來用length屬性獲取數(shù)組的長(zhǎng)度,具體示例如下:
int[]list=newint[10];//定義一個(gè)int類型的數(shù)組
intsize=list.length;//size=10,數(shù)組的長(zhǎng)度
數(shù)組中的變量又稱為元素,考慮到一個(gè)數(shù)組中的元素可能會(huì)很多,為了便于區(qū)分它們,每個(gè)元素都有下標(biāo)(索引),下標(biāo)從0開始,如在int[]list=newint[10]中,list[0]是第1個(gè)元素,list[1]是第2個(gè)元素,……,list[9]是第10個(gè)元素,也就是最后一個(gè)元素。因此,假如數(shù)組list有n個(gè)元素,那么list[0]是第一個(gè)元素,而list[n1]則是最后一個(gè)元素。
如果下標(biāo)值小于0,或者大于等于數(shù)組長(zhǎng)度,編譯程序不會(huì)報(bào)任何錯(cuò)誤,但運(yùn)行時(shí)將出現(xiàn)異常:ArrayIndexOutOfBoundsException:N,即數(shù)組下標(biāo)越界異常,N表示試圖訪問的數(shù)組下標(biāo)。
2.數(shù)組遍歷
數(shù)組的遍歷是指依次訪問數(shù)組中的每個(gè)元素。接下來演示循環(huán)遍歷數(shù)組,如例31所示。
例31TestArrayTraversal.java
1publicclassTestArrayTraversal{
2publicstaticvoidmain(String[]args){
3int[]list={1,2,3,4,5};//定義數(shù)組
4for(inti=0;i
5System.out.println(list[i]);//索引訪問數(shù)組
6}
7}
8}
程序的運(yùn)行結(jié)果如圖3.1所示。
圖3.1例31運(yùn)行結(jié)果
在例31中,聲明并靜態(tài)初始化了一個(gè)int類型的數(shù)組,然后利用for循環(huán)中的循環(huán)變量充當(dāng)數(shù)組的索引,依次遞增索引,從而遍歷數(shù)組元素。
3.數(shù)組最大值和最小值
通過前面已經(jīng)掌握的知識(shí),用數(shù)組的基本用法與流程控制語句的使用來得到數(shù)組中的最大值和最小值。首先把數(shù)組的第一個(gè)數(shù)賦值給變量max和min,分別表示最大值和最小值,再依次判斷數(shù)組的其他數(shù)值的大小,判斷當(dāng)前值是否最大值或最小值,如果不是則進(jìn)行替換,最后輸出最大值和最小值。接下來演示獲取數(shù)組的最大值和最小值,如例32所示。
例32TestMostValue.java
1publicclassTestMostValue{
2publicstaticvoidmain(String[]args){
3//定義數(shù)組
4int[]score={88,62,12,100,28};
5intmax=0;//最大值
6intmin=0;//最小值
7max=min=score[0];//把第一個(gè)元素值賦給max和min
8for(inti=1;i
9if(score[i]>max){//依次判斷后面元素值是否比max大
10max=score[i];//如果大,則修改max的值
11}
12if(score[i]
13min=score[i];//如果小,則修改min的值
14}
15}
16System.out.println("最大值:"+max);
17System.out.println("最小值:"+min);
18}
19}
……