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