Java程序設(shè)計清華大學(xué)軟件學(xué)院下課件_第1頁
Java程序設(shè)計清華大學(xué)軟件學(xué)院下課件_第2頁
Java程序設(shè)計清華大學(xué)軟件學(xué)院下課件_第3頁
Java程序設(shè)計清華大學(xué)軟件學(xué)院下課件_第4頁
Java程序設(shè)計清華大學(xué)軟件學(xué)院下課件_第5頁
已閱讀5頁,還剩321頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

2022/11/181教材雍俊海.Java程序設(shè)計.北京:清華大學(xué)出版社,2008.2022/11/91教材雍俊海.Java程序設(shè)計.北京:2022/11/182輔助教材雍俊海.Java程序設(shè)計教程(第2版).北京:清華大學(xué)出版社,2007.2022/11/92輔助教材雍俊海.Java程序設(shè)計教程(2022/11/183習(xí)題集雍俊海.Java程序設(shè)計習(xí)題集(含參考答案).北京:清華大學(xué)出版社,2006.2022/11/93習(xí)題集雍俊海.Java程序設(shè)計習(xí)題集(2022/11/184參考文獻(xiàn)本課件的參考文獻(xiàn)與下列書的參考文獻(xiàn)相同雍俊海.Java程序設(shè)計.北京:清華大學(xué)出版社,2008.雍俊海.Java程序設(shè)計教程(第2版).北京:清華大學(xué)出版社,2007.雍俊海.Java程序設(shè)計習(xí)題集(含參考答案).北京:清華大學(xué)出版社,2006.雍俊海.Java程序設(shè)計.北京:清華大學(xué)出版社,2004.2022/11/94參考文獻(xiàn)本課件的參考文獻(xiàn)與下列書的參考文2022/11/185第4章數(shù)組、字符串、向量與哈希表雍俊海(Jun-HaiYong)清華大學(xué)軟件學(xué)院SchoolofSoftware,TsinghuaUniversity2022/11/95第4章數(shù)組、字符串、向量與哈希表雍俊海2022/11/186本章總體綱要數(shù)組字符串字符串緩沖區(qū)向量哈希表2022/11/96本章總體綱要數(shù)組2022/11/187數(shù)組由相同類型的若干項數(shù)據(jù)組成例如:publicstaticvoidmain(Stringargs[])其中args是String類型的數(shù)組占用連續(xù)的內(nèi)存地址數(shù)組的靜態(tài)性一旦創(chuàng)建就不能修改數(shù)組的長度類似于動態(tài)數(shù)組的類型類Vector長度可以變大或縮小2022/11/97數(shù)組由相同類型的若干項數(shù)據(jù)組成2022/11/188示例int[]c=new

int[12];c

是數(shù)組名如何獲得數(shù)組的長度?c.length第一個數(shù)組元素的下標(biāo)為0

使用數(shù)組可以通過數(shù)組名與下標(biāo)每個數(shù)組元素類似于普通的變量c[0]=3;c[0]+=5;-4560721543-89062-3164537812c[1]c[2]c[4]c[3]c[5]c[6]c[7]c[8]c[9]c[10]c[11]c[0]c.length2022/11/98示例int[]c=newint2022/11/189下標(biāo)有時也稱為索引必須是整數(shù)或整數(shù)表達(dá)式,例如:c[11]示例:含有運算符的下標(biāo)表達(dá)式:

if(x==3) t=(c[5-2]==c[3])&&(c[x]==c[3]);//t=true2022/11/99下標(biāo)有時也稱為索引2022/11/1810數(shù)組聲明一維數(shù)組變量的聲明格式有如下兩種:(1) 數(shù)組元素的數(shù)據(jù)類型[]變量名;(2) 數(shù)組元素的數(shù)據(jù)類型變量名[];示例:int[]c;String[]names;intc[];Stringnames[];2022/11/910數(shù)組聲明一維數(shù)組變量的聲明格式有如下兩2022/11/1811內(nèi)存分配Java數(shù)組實際上也是對象,所以可通過new

關(guān)鍵字來創(chuàng)建示例:int[]c;

//聲明c=

new

int[12];

//創(chuàng)建對象,并分配內(nèi)存聲明時不必指定數(shù)組的大小上面的兩個語句可以簡化成一個語句int[]c=new

int[12];2022/11/911內(nèi)存分配Java數(shù)組實際上也是對象,所2022/11/1812初始化數(shù)組基本數(shù)據(jù)類型的元素初始化為0值或false非基本數(shù)據(jù)類型的元素初始化為null

可以采用循環(huán)結(jié)構(gòu)初始化數(shù)組示例:double[]squares;squares=newdouble[100];for(inti=0;i<squares.length;i++){squares[i]=i*i;}2022/11/912初始化數(shù)組基本數(shù)據(jù)類型的元素初始化為02022/11/1813通過初始化語句創(chuàng)建數(shù)組Java語言允許通過數(shù)組的初始化語句創(chuàng)建數(shù)組示例:int[]n={10,20,30,40,50};上面語句創(chuàng)建了一個含有五個元素的數(shù)組下標(biāo)值分別為0,1,2,3,4這時不需要運算符new2022/11/913通過初始化語句創(chuàng)建數(shù)組Java語言允許2022/11/1814注意事項當(dāng)通過循環(huán)遍歷數(shù)組時下標(biāo)永遠(yuǎn)不要低于0下標(biāo)永遠(yuǎn)要比數(shù)組元素個數(shù)小當(dāng)數(shù)組下標(biāo)出錯,Java產(chǎn)生ArrayIndexOutOfBoundsException2022/11/914注意事項當(dāng)通過循環(huán)遍歷數(shù)組時2022/11/1815多維數(shù)組最常用的多維數(shù)組是二維數(shù)組

int[][]a=new

int[3][4];二維數(shù)組可以理解成如下圖示的表格a[0][0]a[1][0]a[2][0]a[0][1]a[1][1]a[2][1]a[0][2]a[1][2]a[2][2]a[0][3]a[1][3]a[2][3]行的下標(biāo)值列的下標(biāo)值2022/11/915多維數(shù)組最常用的多維數(shù)組是二維數(shù)組a[2022/11/1816示例1類似于一維數(shù)組進(jìn)行二維數(shù)組的聲明、創(chuàng)建(內(nèi)存分配)與初始化示例:classJ_FillArray{

publicstaticvoidmain(Stringargs[]){

int[][]matrix=newint[4][5];

for(introw=0;row<4;row++){

for(intcol=0;col<5;col++){matrix[row][col]=row+col;}//內(nèi)部for循環(huán)結(jié)束

}//外部for循環(huán)結(jié)束

}//方法main結(jié)束}//類J_FillArray結(jié)束2022/11/916示例1類似于一維數(shù)組進(jìn)行二維數(shù)組的聲2022/11/1817示例2通過初始化語句創(chuàng)建數(shù)組示例:double[][]c={{1.0,2.0,3.0,4.0},{0.0,1.0,0.0,0.0},{0.0,0.0,1.0,0.0}};

2022/11/917示例2通過初始化語句創(chuàng)建數(shù)組2022/11/1818注意事項Java的多維數(shù)組實際上是數(shù)組的數(shù)組即創(chuàng)建以數(shù)組為元素的數(shù)組意味著:二維數(shù)組的每一行可以具有不同的列數(shù)示例:inta[][];a=newint[3][];//allocaterowsa[0]=newint[3];//allocaterow0a[1]=newint[2];//allocaterow1a.length–行數(shù)a[i].length–第i行列數(shù)2022/11/918注意事項Java的多維數(shù)組實際上是2022/11/1819三維數(shù)組思維的擴展:一維數(shù)組二維數(shù)組三維數(shù)組示例:classJ_Fill3DArray{

publicstaticvoidmain(Stringargs[]){

int[][][]M=newint[4][5][3];

for(introw=0;row<4;row++){

for(intcol=0;col<5;col++){

for(intver=0;ver<3;ver++){M[row][col][ver]=row+col+ver;}//內(nèi)部for循環(huán)結(jié)束

}//for循環(huán)結(jié)束

}//外部for循環(huán)結(jié)束

}//方法main結(jié)束}//類J_Fill3DArray結(jié)束2022/11/919三維數(shù)組思維的擴展:一維數(shù)組二維數(shù)2022/11/1820注意事項Java允許數(shù)組的維數(shù)為:三、四、或更大但是,慎用高維數(shù)組甚至三維數(shù)組在實際的應(yīng)用中也比較少出現(xiàn)2022/11/920注意事項Java允許數(shù)組的維數(shù)為:三2022/11/1821本章總體綱要數(shù)組字符串字符串緩沖區(qū)向量哈希表2022/11/921本章總體綱要數(shù)組2022/11/1822String的基本知識String與C語言不同:字符(char)數(shù)組不是字符串(String)String數(shù)值不必以'\u0000'結(jié)束StringaStringbStringcHelloWorld!2022/11/922String的基本知識StringSt2022/11/1823String直接量String直接量雙引號括起來的字符序列示例:“Hello”

或“您好"字符串賦值可以在聲明時賦值

String

c="blue";c是String類型的變量"blue"是String直接量2022/11/923String直接量String直接2022/11/1824String構(gòu)造類String共有11個構(gòu)造方法,其中兩個不被贊成使用(deprecated)參見docs\index.html2022/11/924String構(gòu)造類String2022/11/1825示例//J_StringConstructors.java;開發(fā)者:雍俊海//字符串構(gòu)造方法例程publicclassJ_StringConstructors{

publicstaticvoidmain(Stringargs[]){Strings1=null;Strings2=newString();Strings3="您好!";Strings4=newString(s3);System.out.println("s1:"+s1);System.out.println("s2:"+s2);System.out.println("s3:"+s3);System.out.println("s4:"+s4);}//方法main結(jié)束}//類J_StringConstructors結(jié)束s1不指向任何字符串對象String構(gòu)造方法:創(chuàng)建空字符串String構(gòu)造方法:創(chuàng)建新字符串字符串直接量2022/11/925示例//J_StringConstr2022/11/1826String方法:

length(),charAt()和getChars()方法length()返回String

的長度與數(shù)組不同之處:Strings不含有l(wèi)ength成員域方法charAt(intindex)獲得字符串指定位置的字符方法getChars(intsrcBegin,intsrcEnd,char[]dst,intdstBegin)

拷貝字符串的部分字符序列到指定的字符數(shù)組的指定位置2022/11/926String方法:

length(2022/11/1827字符串比較字符串(String)比較字符類型的數(shù)據(jù)也是數(shù)值類型數(shù)據(jù)比較字符串大小,實際上就是依次比較其所包含的字符的數(shù)值大小小寫字母與大小字母是不相同的2022/11/927字符串比較字符串(String)比較2022/11/1828==

運算符當(dāng)用于基本數(shù)據(jù)類型時,用于判別是否相等當(dāng)用于引用數(shù)據(jù)類型時,用來判別引用是否指向相同的對象Java虛擬機中含有字符串池(直接量在此池內(nèi)),相同內(nèi)容的字符串直接量相同的對象s1=“hello”;//字符串直接量s2=newString("hello");s1=="hello";//trues2=="hello";//false2022/11/928==運算符當(dāng)用于基本數(shù)據(jù)類型時,用于2022/11/1829字符串(String)比較方法booleanequals(ObjectanObject)比較當(dāng)前的字符串與指定的對象比較結(jié)果為真當(dāng)且僅當(dāng)給定的參數(shù)不為空,并且具有完全相同的字符序列例如:s1.equals("Hi");booleanequalsIgnoreCase(StringanotherString)判別相等,但不區(qū)分大小寫例如:在不區(qū)分大小寫情況下,“hello”與“HELLO”相等2022/11/929字符串(String)比較方法bool2022/11/1830字符串(String)比較方法intcompareTo(StringanotherString)

比較兩個字符串的內(nèi)容返回:0:如果字符串內(nèi)容完全相同小于0的值:如果在比較第一個不相同字符,當(dāng)前字符串的字符的值小于anotherString對應(yīng)的字符的值大于0的值:如果在比較第一個不相同字符,當(dāng)前字符串的字符的值大于anotherString對應(yīng)的字符的值intcompareToIgnoreCase(Stringstr)

比較兩個字符串的內(nèi)容,但不區(qū)分大小寫2022/11/930字符串(String)比較方法int2022/11/1831查找字符串中的字符或子串查找字符串(String)中的字符或子串方法indexOf四種重載方法indexOf返回第一次找到的時下標(biāo)如果沒有找到,則返回-1示例:Stringname="CoolTools";System.out.println(name.indexOf("oo"));2022/11/931查找字符串中的字符或子串查找字符串(S2022/11/1832查找字符串中的字符或子串方法lastIndexOf

publicintlastIndexOf(intch,intfromIndex)從指定位置往回查找,返回找到的最大的字符下標(biāo)位置即返回滿足下面條件的最大值:(this.charAt(k)==ch)&&(k<=fromIndex)返回-1:如果當(dāng)前字符串不含該字符2022/11/932查找字符串中的字符或子串方法last2022/11/1833從當(dāng)前字符串中抽取子字符串方法substringsubstring(intbeginIndex)

返回新的字符串:當(dāng)前字符串的子串該子串從指定的位置開始,并一直到當(dāng)前字符串結(jié)束為止substring(intbeginIndex,intendIndex)返回新的字符串:當(dāng)前字符串的子串該子串從指定的位置(beginIndex)開始,到指定的位置(endIndex

-1)結(jié)束2022/11/933從當(dāng)前字符串中抽取子字符串方法sub2022/11/1834字符串(String)拼接方法concat拼接兩個字符串,并返回一個新字符串源字符串不會被修改s1.concat(s2)返回字符串s1和s2拼接的結(jié)果示例:Strings1="ABC";Strings2="XYZ";s1=s1.concat(s2);//s1=s1+s2;2022/11/934字符串(String)拼接方法con2022/11/1835類String的成員方法valueOf靜態(tài)(static)成員方法valueOf將參數(shù)的值轉(zhuǎn)化成相應(yīng)的字符串valueOf(char[]data)

return

new

String(data);valueOf(char[]data,intoffset,intcount)return

newString(data,offset,count);其它valueOf方法的參數(shù)的類型:boolean、char、int、long、float、double和Object對象還可以通過方法toString轉(zhuǎn)化成字符串2022/11/935類String的成員方法valueOf2022/11/1836其它String方法其它String方法s1.replace(char1,char2)返回一個新的字符串,它是將s1中的所有char1替換成的結(jié)果char2源字符串沒有發(fā)生變化如果s1不含char1,則返回源字符串的引用,即s1示例:“mesquiteinyourcellar”.replace(‘e’,‘o’)

結(jié)果返回"mosquitoinyourcollar"“JonL”.replace(‘q’,‘x’)結(jié)果返回“JonL”(沒有發(fā)生變化)2022/11/936其它String方法其它String方2022/11/1837其它String方法s1.toUpperCase返回對應(yīng)的新字符串,各個字母都是大寫的如果沒有字符被修改,則返回源字符串的引用類似方法s1.toLowerCase練習(xí):請試著分析方法toUpperCase是如何實現(xiàn)的?2022/11/937其它String方法s1.toUppe2022/11/1838其它String方法s1.trim()返回新字符串,源字符串最前面和最后面的的空白符如果字符串沒有被改變,則返回源字符串的引用s1.toString()由于s1本身就是字符串了,所以返回s1本身其它引用類型也可以通過方法toString,生成相應(yīng)的字符串s1.toCharArray()將字符串轉(zhuǎn)換成字符數(shù)組2022/11/938其它String方法s1.trim(2022/11/1839其它String方法方法intern返回具有相同內(nèi)容的字符串的引用如果字符串池含有該內(nèi)容的字符串,則返回字符串池中具有該內(nèi)容的字符串的引用如果字符串池沒有字符串的內(nèi)容與其相同,則在字符串池中創(chuàng)建具有該內(nèi)容的字符串,再返回新創(chuàng)建的字符串的引用字符串池組成:字符串直接量以及由方法intern產(chǎn)生的字符串字符串池中的字符串s與t

:s與t具有相同內(nèi)容(s.equals(t))當(dāng)且僅當(dāng)指向s與t的同一個字符串(ern()==ern())可以采用這個機制加速字符串是否相等的判定2022/11/939其它String方法方法intern2022/11/1840本章總體綱要數(shù)組字符串字符串緩沖區(qū)向量哈希表2022/11/940本章總體綱要數(shù)組2022/11/1841類StringBuffer類String字符串(String)對象一旦創(chuàng)建,其內(nèi)容不能再被修改(read-only)類StringBufferStringBuffer

對象的內(nèi)容是可以被修改的除了字符的長度之外,還有容量的概念通過動態(tài)改變?nèi)萘康拇笮?,加速字符管?022/11/941類StringBuffer類Stri2022/11/1842三種StringBuffer構(gòu)造方法buf1=new

StringBuffer();創(chuàng)建空的StringBuffer對象容量為16字符buf2=new

StringBuffer(capacity);創(chuàng)建空的StringBuffer對象指定容量大小buf3=newStringBuffer(myString);創(chuàng)建含有相應(yīng)字符序列的StringBuffer對象容量為myString.length()+16示例:

StringBufferb=newStringBuffer("hello");2022/11/942三種StringBuffer構(gòu)造方法2022/11/1843String和StringBufferString

和StringBuffer

是兩種不同的類不能用字符串(String)的示例對象調(diào)用類(StringBuffer)的成員方法反之亦然String

StringBuffer構(gòu)造方法StringBuffer

String構(gòu)造方法方法toString()2022/11/943String和StringBuff2022/11/1844StringBuffer方法方法length()返回StringBuffer

的長度方法capacity()返回StringBuffer

的容量方法setLength(intnewLength)

增加或減小StringBuffer

的長度2022/11/944StringBuffer方法方法l2022/11/1845方法ensureCapacity(intminimumCapacity)參見在線幫且文檔閱讀方法ensureCapacity的切確含義確保StringBuffer對象的容量至少為指定的大小如果當(dāng)前容量比指定值(minimumCapacity)小,則重新分配內(nèi)存新容量大小為如下的值中較大者:參數(shù)minimumCapacity

的值.兩倍的舊容量,再加上2.如果minimumCapacity的值比已有容量小,則不做任何操作,直接返回2022/11/945方法ensureCapacity(2022/11/1846處理StringBuffer內(nèi)字符的方法方法charAt(intindex)

返回StringBuffer

對象中指定位置的字符方法setCharAt(intindex,charch)

設(shè)置StringBuffer對象中指定位置的字符方法getChars(intsrcBegin,intsrcEnd,

char[]dst,intdstBegin)

將StringBuffer對象中指定的字符子序列,拷貝到指定的字符數(shù)組(dst)方法reverse()將StringBuffer

對象中的字符序列按逆序方式排列2022/11/946處理StringBuffer內(nèi)字符的方2022/11/184711種append

方法允許數(shù)值類型的值添加到StringBuffer對象中示例:publicStringreverseIt(Stringsource){

intc;len=source.length();

StringBufferdest=newStringBuffer(len);

for(c=(len-1);c>=0;c--){dest.append(source.charAt(c));}

returndest.toString();}2022/11/94711種append方法允許數(shù)值類2022/11/1848insert

和delete

方法方法insert允許將各種數(shù)據(jù)插到StringBuffer對象的指定位置方法delete(intstart,intend)

和deleteCharAt(intindex)

允許刪除StringBuffer對象中的指定字符2022/11/948insert和delete方法方2022/11/1849本章總體綱要數(shù)組字符串字符串緩沖區(qū)向量哈希表2022/11/949本章總體綱要數(shù)組2022/11/1850向量向量所對應(yīng)的類是類java.util.Vector向量變量的聲明格式Vector<向量元素的數(shù)據(jù)類型>變量名;示例Vector<String>vs;2022/11/950向量向量所對應(yīng)的類是類java.uti2022/11/1851創(chuàng)建向量實例對象Vector<String>vs=newVector<String>();Vector<Object>vo=newVector<Object>();2022/11/951創(chuàng)建向量實例對象Vector<Stri2022/11/1852增加元素publicbooleanadd(Eo)publicvoidaddElement(Eobj)示例vs.add("Tom");2022/11/952增加元素publicboolean2022/11/1853修改元素publicEset(intindex,Eelement)publicvoidsetElementAt(Eobj,intindex)2022/11/953修改元素publicEset(in2022/11/1854刪除元素publicvoidclear()publicvoidremoveAllElements()publicEremove(intindex)publicvoidremoveElementAt(intindex)2022/11/954刪除元素publicvoidcle2022/11/1855通過迭代器(iterator)獲取向量對象的各個元素類java.util.Vector的成員方法publicIterator<E>iterator()接口java.util.Iterator的成員方法booleanhasNext()接口java.util.Iterator的成員方法Enext()2022/11/955通過迭代器(iterator)獲取向量2022/11/1856本章總體綱要數(shù)組字符串字符串緩沖區(qū)向量哈希表2022/11/956本章總體綱要數(shù)組2022/11/1857哈希函數(shù)或散列函數(shù)示例h1(s)=s[0]*31(n-1)+s[1]*31(n-2)+......+s[n-1]哈希碼(hashcode)或散列索引由哈希函數(shù)計算出來的數(shù)值2022/11/957哈希函數(shù)或散列函數(shù)示例2022/11/1858哈希表的空間利用率哈希表的容量(capacity)哈希表的存儲空間大小哈希表的裝填因子2022/11/958哈希表的空間利用率哈希表的容量(cap2022/11/1859哈希表類java.util.Hashtable2022/11/959哈希表類java.util.Hasht2022/11/1860示例//J_Hashtable.java;開發(fā)者:雍俊海//通過哈希表形成數(shù)組下標(biāo)與值之間的雙向映射。import

java.util.Hashtable;publicclassJ_Hashtable{

publicstaticvoidmain(Stringargs[]){String[]sa={"Mary","Tom","John","James","Louis","Jim","Rose","Ann","Liza","Betty","Henry","Albert"};Hashtable<String,Integer>ht=newHashtable<String,Integer>();2022/11/960示例//J_Hashtable.ja2022/11/1861示例

//往哈希表中添加元素,并使得關(guān)鍵字與值之間建立起映射關(guān)系

int

i;

for(i=0;i<sa.length;i++)ht.put(sa[i],newInteger(i));

//通過下標(biāo)獲得姓名(字符串值)i=8;System.out.println("在sa數(shù)組中,下標(biāo)為"+i+"的字符串是\""+sa[i]+"\"");

//通過哈希表,直接獲得姓名(字符串值)的數(shù)組下標(biāo)Strings=sa[i];System.out.println("在sa數(shù)組中,\""+s+"\"的下標(biāo)是"+ht.get(s));}//方法main結(jié)束}//類J_Hashtable結(jié)束2022/11/961示例//往哈希表中添2022/11/1862編譯,運行&輸出2022/11/962編譯,運行&輸出2022/11/1863作業(yè)教材習(xí)題4.52022/11/963作業(yè)教材習(xí)題4.52022/11/1864本課件使用要求使用本課件,必須注明引用(具體見下一個幻燈片)書及課件均可能出現(xiàn)一些錯誤和缺陷,懇切希望廣大讀者特別是講授此課程的老師批評指正2022/11/964本課件使用要求使用本課件,必須注明引用2022/11/1865引用聲明本課件來源于(或參考了)下面的書及其課件:雍俊海.《Java程序設(shè)計》.北京:清華大學(xué)出版社,2008.2022/11/965引用聲明本課件來源于(或參考了)下面的2022/11/1866免責(zé)聲明請合法使用課件,其用途應(yīng)當(dāng)合法有益而且不應(yīng)對任何人造成任何傷害或損失同時請注意教材作者及出版社沒有對本課件做出任何承諾與保證2022/11/966免責(zé)聲明請合法使用課件,其用途應(yīng)當(dāng)合法2022/11/1867參考文獻(xiàn)本課件的參考文獻(xiàn)與下列書的參考文獻(xiàn)相同雍俊海.Java程序設(shè)計.北京:清華大學(xué)出版社,2008.雍俊海.Java程序設(shè)計教程(第2版).北京:清華大學(xué)出版社,2007.雍俊海.Java程序設(shè)計習(xí)題集(含參考答案).北京:清華大學(xué)出版社,2006.雍俊海.Java程序設(shè)計.北京:清華大學(xué)出版社,2004.2022/11/967參考文獻(xiàn)本課件的參考文獻(xiàn)與下列書的參考2022/11/1868謝謝請多指教2022/11/968謝謝請多指教2022/11/1869第5章泛型和枚舉雍俊海(Jun-HaiYong)清華大學(xué)軟件學(xué)院SchoolofSoftware,TsinghuaUniversity2022/11/969第5章泛型和枚舉雍俊海(Jun2022/11/1870本章總體綱要泛型枚舉2022/11/970本章總體綱要泛型2022/11/1871定義格式類[類修飾詞列表]

class

類名

<類型參數(shù)列表>

[extends

父類名]

[implements

接口名稱列表]{

類體}接口[接口修飾詞列表]

interface

接口名<類型參數(shù)列表>

[extends

接口名稱列表]{

接口體}2022/11/971定義格式類2022/11/1872類型參數(shù)的定義格式類型變量標(biāo)識符類型變量標(biāo)識符

extends

父類型類型變量標(biāo)識符

extends父類型1

&

父類型2

&......&

父類型n2022/11/972類型參數(shù)的定義格式類型變量標(biāo)識符2022/11/1873示例//J_Add.java;開發(fā)者:雍俊海//泛型例程publicclassJ_Add<T>{

publicStringmb_sum(Ta1,Ta2,Ta3){

return(a1.toString()+a2.toString()+a3.toString());}//方法mb_sum結(jié)束

publicstaticvoidmain(Stringargs[]){J_Add<Integer>b=newJ_Add<Integer>();Integera1=newInteger(1);Integera2=newInteger(2);Integera3=newInteger(3);System.out.println(b.mb_sum(a1,a2,a3));}//方法main結(jié)束}//類J_Add結(jié)束2022/11/973示例//J_Add.java;開發(fā)2022/11/1874編譯、運行&結(jié)果2022/11/974編譯、運行&結(jié)果2022/11/1875示例//J_AddInterface.java;開發(fā)者:雍俊海//泛型例程interfaceJ_Interface<TextendsNumber>{

publicintmb_sum(Ta1,Ta2,Ta3);}//接口J_Interface結(jié)束publicclassJ_AddInterface<TextendsNumber>

implementsJ_Interface<T>{

publicintmb_sum(Ta1,Ta2,Ta3){intb1=Value();intb2=Value();intb3=Value();

return(b1+b2+b3);}//方法mb_sum結(jié)束2022/11/975示例//J_AddInterface2022/11/1876示例

publicstaticvoid

main(Stringargs[]){J_AddInterface<Integer>b=newJ_AddInterface<Integer>();Integera1=newInteger(1);Integera2=newInteger(2);Integera3=newInteger(3);System.out.println(b.mb_sum(a1,a2,a3));}//方法main結(jié)束}//類J_AddInterface結(jié)束2022/11/976示例publicstatic2022/11/1877編譯、運行&結(jié)果2022/11/977編譯、運行&結(jié)果2022/11/1878本章總體綱要泛型枚舉2022/11/978本章總體綱要泛型2022/11/1879枚舉的基本定義格式[枚舉類型修飾詞列表]

enum

枚舉類型標(biāo)識符{

枚舉常量1,枚舉常量2,......,枚舉常量n}2022/11/979枚舉的基本定義格式[枚舉類型修飾詞列表2022/11/1880示例enumE_SEASON{

春季,夏季,秋季,冬季}//枚舉E_SEASON結(jié)束2022/11/980示例enumE_SEASON2022/11/1881示例//J_Enum.java;開發(fā)者:雍俊海//枚舉例程enum

E_SEASON{春季,夏季,秋季,冬季}//枚舉E_SEASON結(jié)束publicclassJ_Enum{

publicstaticvoidmain(Stringargs[]){E_SEASON[]sa=E_SEASON.values();

for(inti=0;i<sa.length;i++){2022/11/981示例//J_Enum.java;開2022/11/1882示例

switch(sa[i]){

case春季:System.out.println("春季花滿天");

break;

case夏季:System.out.println("夏季熱無邊");

break;

case秋季:System.out.println("秋季果累累");

break;

case冬季:System.out.println("冬季雪皚皚");

break;}//switch結(jié)構(gòu)結(jié)束}//for循環(huán)結(jié)束}//方法main結(jié)束}//類J_Enum結(jié)束2022/11/982示例switc2022/11/1883編譯、運行&結(jié)果2022/11/983編譯、運行&結(jié)果2022/11/1884作業(yè)習(xí)題5.2習(xí)題5.32022/11/984作業(yè)習(xí)題5.22022/11/1885本課件使用要求使用本課件,必須注明引用(具體見下一個幻燈片)書及課件均可能出現(xiàn)一些錯誤和缺陷,懇切希望廣大讀者特別是講授此課程的老師批評指正2022/11/985本課件使用要求使用本課件,必須注明引用2022/11/1886引用聲明本課件來源于(或參考了)下面的書及其課件:雍俊海.《Java程序設(shè)計》.北京:清華大學(xué)出版社,2008.2022/11/986引用聲明本課件來源于(或參考了)下面的2022/11/1887免責(zé)聲明請合法使用課件,其用途應(yīng)當(dāng)合法有益而且不應(yīng)對任何人造成任何傷害或損失同時請注意教材作者及出版社沒有對本課件做出任何承諾與保證2022/11/987免責(zé)聲明請合法使用課件,其用途應(yīng)當(dāng)合法2022/11/1888參考文獻(xiàn)本課件的參考文獻(xiàn)與下列書的參考文獻(xiàn)相同雍俊海.Java程序設(shè)計.北京:清華大學(xué)出版社,2008.雍俊海.Java程序設(shè)計教程(第2版).北京:清華大學(xué)出版社,2007.雍俊海.Java程序設(shè)計習(xí)題集(含參考答案).北京:清華大學(xué)出版社,2006.雍俊海.Java程序設(shè)計.北京:清華大學(xué)出版社,2004.2022/11/988參考文獻(xiàn)本課件的參考文獻(xiàn)與下列書的參考2022/11/1889謝謝請多指教2022/11/989謝謝請多指教2022/11/1890第6章異常處理雍俊海(Jun-HaiYong)清華大學(xué)軟件學(xué)院SchoolofSoftware,TsinghuaUniversity2022/11/990第6章異常處理雍俊海(Jun-2022/11/1891Java異常處理(Exception)基礎(chǔ)異常(Exception)?異常(Exception)是正常程序流程所不能處理或沒有處理的異常情況或異常事件。在有些書中,異常也稱作例外。2022/11/991Java異常處理(Exception2022/11/1892格式在try語句塊中包含可能會產(chǎn)生異常的語句緊接著若干個catch語句塊,進(jìn)行異常處理catch語句塊與finally語句塊至少存在一個try{

//可能會拋出異常的代碼}catch(ExceptionTyperef){

//異常處理代碼

}finally{

//…}2022/11/992格式在try語句塊中包含可能會產(chǎn)生異常2022/11/1893為什么需要異常?強制程序異常/錯誤處理同時指定需要異常的種類異常處理模型提供了一種統(tǒng)一處理異常/錯誤的模式傳統(tǒng)程序方法:設(shè)置標(biāo)志位,或返回錯誤碼,分別處理各種異常情況。但在編程時常常出現(xiàn)這樣的情況:忘了對某些異常情況進(jìn)行處理,尤其是當(dāng)存在多個分支或者多個開發(fā)人員共同開發(fā)程序時。簡化對異常情況的處理,減少if-else語句2022/11/993為什么需要異常?強制程序異常/錯誤處理2022/11/1894什么時候會發(fā)生異常?數(shù)組的下標(biāo)越界打開不存在的文件網(wǎng)絡(luò)無法連接操作數(shù)超出所要求的范圍少了所需加載的類,自定義異常,要求程序處理2022/11/994什么時候會發(fā)生異常?數(shù)組的下標(biāo)越界2022/11/1895處理異常的幾種常用方法一旦捕獲異常,馬上進(jìn)行處理重新拋出異常捕獲異常,但并不處理通過語句System.exit()退出應(yīng)用程序2022/11/995處理異常的幾種常用方法一旦捕獲異常,馬2022/11/1896異常(Exceptions)類型常見異常內(nèi)存耗盡數(shù)組下標(biāo)越界除數(shù)為0非法的參數(shù)(方法的參數(shù))2022/11/996異常(Exceptions)類型常見異2022/11/1897異常(Exception)的層次結(jié)構(gòu)2022/11/997異常(Exception)的層次結(jié)構(gòu)2022/11/1898運行時發(fā)生的異常(RuntimeExceptions)異常隨時都可以發(fā)生ArrayIndexOutOfBoundsExceptionNullPointerException定義了引用,但不指向任何對象(object)ClassCastException數(shù)據(jù)類型間的轉(zhuǎn)換不合法良好的編程習(xí)慣,可以減少很多異常的發(fā)生2022/11/998運行時發(fā)生的異常(RuntimeExc2022/11/1899受檢異常和非受檢異常受檢異常必須在方法聲明時通過throws列出在編譯時就能被檢測出非受檢測異常不必在throws列表中錯誤(Errors)和運行時異常(RuntimeExceptions)受檢異常,必須處理才能通過編譯運行時異常只有在運行時才能被發(fā)現(xiàn)錯誤常常指的是致命性錯誤,常常也無法處理2022/11/999受檢異常和非受檢異常受檢異常2022/11/18100處理多種異常(Exception)類型如果含有多外catch語句塊,則異常會被第一個與其相匹配的catch語句塊處理2022/11/9100處理多種異常(Exception)類2022/11/18101finally

語句塊在異常處理過程中,finally

語句塊總是會被執(zhí)行到:無論有沒有異常發(fā)生,也無論有沒有異常被捕捉到可選項:finally

語句塊,通常位于catch

語句塊的后面可以用來釋放try語句塊中獲得的資源例如,關(guān)閉在try語句塊中打開的文件2022/11/9101finally語句塊在異常處理過程2022/11/18102throws

列表在方法的聲明處列出所有的受檢異常返回類型

方法名(參數(shù)列表

)throws

異常類型1,異常類型2,…{//方法體}在本方法內(nèi)就可以不處理這些異常調(diào)用該方法的方法就必須處理這些異常示例:publicstaticvoidg()throwsException{

thrownewException();}//方法g結(jié)束2022/11/9102throws列表在方法的聲明處列出2022/11/18103異常處理:捕捉-或者-聲明如果一個方法調(diào)用一個拋出受檢異常的方法(含有throws列表的方法),則該方法必須捕捉這些受檢異常,或通過throws列表聲明這些異常2022/11/9103異常處理:捕捉-或者-聲明如果一個2022/11/18104重新拋出異常如果catch語句塊不處理某種異常,可以重新拋出異常拋出異常的方法:

throwe;由其外層的try-catch

語句塊處理2022/11/9104重新拋出異常如果catch語句塊不處2022/11/18105作業(yè)習(xí)題6.2習(xí)題6.32022/11/9105作業(yè)習(xí)題6.22022/11/18106本課件使用要求使用本課件,必須注明引用(具體見下一個幻燈片)書及課件均可能出現(xiàn)一些錯誤和缺陷,懇切希望廣大讀者特別是講授此課程的老師批評指正2022/11/9106本課件使用要求使用本課件,必須注明引2022/11/18107引用聲明本課件來源于(或參考了)下面的書及其課件:雍俊海.《Java程序設(shè)計》.北京:清華大學(xué)出版社,2008.2022/11/9107引用聲明本課件來源于(或參考了)下面2022/11/18108免責(zé)聲明請合法使用課件,其用途應(yīng)當(dāng)合法有益而且不應(yīng)對任何人造成任何傷害或損失同時請注意教材作者及出版社沒有對本課件做出任何承諾與保證2022/11/9108免責(zé)聲明請合法使用課件,其用途應(yīng)當(dāng)合2022/11/18109參考文獻(xiàn)本課件的參考文獻(xiàn)與下列書的參考文獻(xiàn)相同雍俊海.Java程序設(shè)計.北京:清華大學(xué)出版社,2008.雍俊海.Java程序設(shè)計教程(第2版).北京:清華大學(xué)出版社,2007.雍俊海.Java程序設(shè)計習(xí)題集(含參考答案).北京:清華大學(xué)出版社,2006.雍俊海.Java程序設(shè)計.北京:清華大學(xué)出版社,2004.2022/11/9109參考文獻(xiàn)本課件的參考文獻(xiàn)與下列書的參2022/11/18110謝謝請多指教2022/11/9110謝謝請多指教2022/11/18111第7章文件與數(shù)據(jù)流雍俊海(Jun-HaiYong)清華大學(xué)軟件學(xué)院SchoolofSoftware,TsinghuaUniversity2022/11/9111第7章文件與數(shù)據(jù)流雍俊海(J2022/11/18112本章總體綱要輸入流與輸出流隨機訪問文件讀寫器文件類File2022/11/9112本章總體綱要輸入流與輸出流2022/11/18113文件與數(shù)據(jù)流簡介包java.io

含有進(jìn)行I/O處理的各種類兩個主要數(shù)據(jù)類 輸入:java.io.InputStream

輸出:java.io.OutputStream兩個主要的讀寫器類:

讀入:java.io.Reader

寫出:java.io.Writer.2022/11/9113文件與數(shù)據(jù)流簡介包java.io2022/11/18114什么是數(shù)據(jù)流?數(shù)據(jù)流是一系列的數(shù)據(jù)例如:System.in、System.out或System.err

所處理的對象是數(shù)據(jù)流System.in-標(biāo)準(zhǔn)輸入(從鍵盤)System.out–標(biāo)準(zhǔn)輸出(到屏幕)System.err–標(biāo)準(zhǔn)錯誤輸出(到屏幕)可以重新定向(例如:將從鍵盤改為從數(shù)據(jù)文件)2022/11/9114什么是數(shù)據(jù)流?數(shù)據(jù)流是一系列的數(shù)據(jù)2022/11/18115處理數(shù)據(jù)流的核心思想處理數(shù)據(jù)流的核心思想能過循環(huán)處理每個數(shù)據(jù)單元,直到遇到結(jié)束符或出現(xiàn)異常(Exception)結(jié)束符在Unix操作系統(tǒng)下,鍵入Control-D表示數(shù)據(jù)流的結(jié)束在Windows操作系統(tǒng)下,鍵入Control-Z表示數(shù)據(jù)流的結(jié)束2022/11/9115處理數(shù)據(jù)流的核心思想處理數(shù)據(jù)流的核心2022/11/18116什么是文件?文件可以用來長期保存大量的數(shù)據(jù)在程序結(jié)束后仍能長期(永久)存在文件一般位于副存儲設(shè)備上硬盤光盤磁帶保存在變量或數(shù)組中的數(shù)據(jù)是臨時性數(shù)據(jù)當(dāng)程序結(jié)束時一般就會丟失2022/11/9116什么是文件?文件2022/11/18117Java文件中的結(jié)構(gòu)Java數(shù)據(jù)流無其它結(jié)構(gòu)文件本身沒有“記錄”的概念程序員根據(jù)實際應(yīng)用的需要指定文件的結(jié)構(gòu)2022/11/9117Java文件中的結(jié)構(gòu)Java數(shù)據(jù)流2022/11/18118類InputStream類java.io.InputStream是一個抽象(abstract)類,聲明了從原始字節(jié)數(shù)據(jù)流讀入數(shù)據(jù)的基本方法類中聲明的方法:publicabstractintread()throwsIOExceptionpublicintread(byte[]data)throwsIOExceptionpublicintread(byte[]data,intoffset,intlength)throwsIOExceptionpubliclongskip(longn)throwsIOExceptionpublicintavailable()throwsIOExceptionpublicvoidclose()throwsIOExceptionpublicvoidmark(intreadlimit)publicvoidreset()throwsIOExceptionpublicbooleanmarkSupported()2022/11/9118類InputStream類java2022/11/18119以字節(jié)為單位讀入數(shù)據(jù)類InputStream的成員方法read()讀入單個無符號字節(jié)(unsignedbyte)的數(shù)據(jù),并返回一個整數(shù)類型(int)的值(與讀入的無符號字節(jié)數(shù)據(jù)相對應(yīng))正常返回:介于0和255之間的一個數(shù)如果遇到數(shù)據(jù)流結(jié)束,則返回-1publicabstractintread()throwsIOException

2022/11/9119以字節(jié)為單位讀入數(shù)據(jù)類InputSt2022/11/18120方法read()下面的兩個方法可以一次讀入多個字節(jié)到數(shù)組中java.io.InputStreampublicintread(byte[]data)throws

IOException

publicintread(byte[]data,intoffset,intlength)throwsIOException

2022/11/9120方法read()下面的兩個方法可2022/11/18121計算可讀入的字節(jié)方法available()給出可以讀入的字節(jié)數(shù)這樣在讀數(shù)據(jù)之前就知道可以讀入的字節(jié)數(shù)java.io.InputStreampublicintavailable()throwsIOException2022/11/9121計算可讀入的字節(jié)方法availab2022/11/18122關(guān)閉數(shù)據(jù)流當(dāng)處理完數(shù)據(jù)流時,應(yīng)當(dāng)關(guān)閉該數(shù)據(jù)流,以便釋放該數(shù)據(jù)流所關(guān)聯(lián)的資源publicvoidclose()throwsIOException2022/11/9122關(guān)閉數(shù)據(jù)流當(dāng)處理完數(shù)據(jù)流時,應(yīng)當(dāng)關(guān)閉2022/11/18123輸出流與InputStream相似,OutputStream

也是abstract

類類中的成員方法:publicabstractvoidwrite(intb)throwsIOExceptionpublicvoidwrite(byte[]data)throwsIOExceptionpublicvoidwrite(byte[]data,intoffset,intlength)throwsIOExceptionpublicvoidflush()throwsIOExceptionpublicvoidclose()throwsIOException

有時輸出流會先輸出到緩存中,最后再一起將數(shù)據(jù)寫到指定的位置(如文件)。方法flush()可以強制進(jìn)行輸出,即強制將數(shù)據(jù)寫到指定的位置(如文件/標(biāo)準(zhǔn)輸出)2022/11/9123輸出流與InputStream相似2022/11/18124Print數(shù)據(jù)流類java.io.PrintStream

是類FilterOutputStream的子類示例:System.out

和System.err類PrintStream

的實例對象不會拋出(throws)異常(IOException)這個類“吃掉”(traps)所有的異常(IOExceptions)2022/11/9124Print數(shù)據(jù)流類java.io2022/11/18125Print數(shù)據(jù)流java.lang.Object|+--java.io.OutputStream|+--java.io.FilterOutputStream|+--java.io.PrintStream2022/11/9125Print數(shù)據(jù)流java.lang2022/11/18126標(biāo)準(zhǔn)數(shù)據(jù)流java.lang.Object|+--java.lang.SystemstaticPrintStream

err

標(biāo)準(zhǔn)錯誤輸出流staticInputStream

in

標(biāo)準(zhǔn)輸入流staticPrintStream

out

標(biāo)準(zhǔn)輸出流2022/11/9126標(biāo)準(zhǔn)數(shù)據(jù)流java.lang.Obj2022/11/18127文件與數(shù)據(jù)流包java.io中含有對文件進(jìn)行處理的類FileInputStream

以字節(jié)為單位從文件中輸入數(shù)據(jù)FileOutputStream以字節(jié)為單位輸出數(shù)據(jù)到文件中FileReader

以字符為單位讀取文件數(shù)據(jù)FileWriter以字符為單位寫數(shù)據(jù)到文件中隨機訪問文件RandomAccessFile2022/11/9127文件與數(shù)據(jù)流包java.io中含有對2022/11/18128從文件中輸入類java.io.FileInputStream

表示從文件中輸入字節(jié)數(shù)據(jù)的輸入流(InputStream)類中的成員方法:publicFileInputStream(Stringname)throwsFileNotFoundExceptionpublicFileInputStream(Filefile)throwsFileNotFoundExceptionpublicFileInputStream(FileDescriptorfdObj)publicnativeintread()throwsIOExceptionpublicintread(byte[]data)throwsIOExceptionpublicintread(byte[]data,intoffset,intlength)throwsIOExceptionpublicnativelongskip(longn)throwsIOExceptionpublicnativeintavailable()throwsIOExceptionpublicnativevoidclose()throwsIOExceptionpublicfinalFileDescriptorgetFD()throwsIOException2022/11/9128從文件中輸入類java.io.Fil2022/11/18129寫數(shù)據(jù)到文件中類java.io.FileOutputStream表示將字節(jié)數(shù)據(jù)寫入到文件中的輸出流(OutputStream)類中的成員方法:publicFileOutputStream(Stringname)throwsIOExceptionpublicFileOutputStream(Stringname,booleanappend)throwsIOExceptionpublicFileOutputStream(Filefile)throwsIOExceptionpublicFileOutputStream(FileDescriptorfdObj)publicnativevoidwrite(intb)throwsIOExceptionpublicvoidwrite(byte[]data)throwsIOExceptionpublicvoidwrite(byte[]data,intoffset,intlength)throwsIOExceptionpublicnativevoidclose()throwsIOExceptionpublicfinalFileDescriptorgetFD()throwsIOException2022/11/9129寫數(shù)據(jù)到文件中類java.io.Fi2022/11/18130Data(數(shù)據(jù))輸入/輸出流類類java.io.DataInputStream

和類java.io.DataOutputStream

提供讀取和寫出基本數(shù)據(jù)類型也字符串類型(String)的數(shù)據(jù)讀寫方式具有機器(平臺)無關(guān)性通常運用類DataInputStream

讀取運用類DataOutputStream寫出的數(shù)據(jù)2022/11/9130Data(數(shù)據(jù))輸入/輸出流類類j2022/11/18131類DataOutputStream中的方

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論