版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第1講:Java入門內(nèi)容提要課程簡(jiǎn)介什么是JavaJava的起源與發(fā)展搭建開發(fā)環(huán)境HelloWorld案例JDKAPI文檔Java學(xué)習(xí)建議1課程簡(jiǎn)介與其它課程的關(guān)系你將學(xué)到什么?下一步能做什么?考核方式(1)平時(shí):20%,以作業(yè)/考勤為依據(jù)(2)實(shí)訓(xùn)項(xiàng)目:20%(3)單元測(cè)驗(yàn):30%。(4)期末考試:開卷,30%教學(xué)目標(biāo)了解Java語(yǔ)言產(chǎn)生的背景、主要特點(diǎn)、與C/C++的區(qū)別以及Java的應(yīng)用情況和最新進(jìn)展,激發(fā)學(xué)習(xí)興趣。會(huì)搭建自己的Java程序開發(fā)平臺(tái)。能編寫、編譯、運(yùn)行一個(gè)簡(jiǎn)單的Java程序理解Java程序的編譯執(zhí)行過(guò)程。教學(xué)重點(diǎn)與難點(diǎn)重點(diǎn):掌握J(rèn)ava程序的編譯和執(zhí)行方法。難點(diǎn):1)對(duì)Java虛擬機(jī)概念及其工作原理的理解。2)對(duì)Java程序的編譯、執(zhí)行過(guò)程的理解。2什么是JavaJava是一種通用的、并發(fā)的、基于類的、面向?qū)ο蟮母呒?jí)編程語(yǔ)言。具有簡(jiǎn)單、面向?qū)ο?、分布式、多線程、高性能、可移植、健壯、安全、跨平臺(tái)等特點(diǎn)。Java在嵌入式軟件、桌面軟件和網(wǎng)絡(luò)分布式軟件領(lǐng)域具有廣泛的應(yīng)用。3Java的起源與發(fā)展Java起源于1991年Sun公司的一個(gè)叫“Green”的項(xiàng)目。1995年5月23日,Sun在SunWorld’95上正式發(fā)布Java和HotJava瀏覽器,這標(biāo)志著Java的誕生。觸發(fā)了Java進(jìn)軍Internet。1996年1月,Sun發(fā)布了JDK1.0,當(dāng)年12月發(fā)布JDK1.1。1998年2月,發(fā)布了JDK1.2。1999年,Java技術(shù)被分成J2SE(原來(lái)的JDK)、J2EE、J2ME三個(gè)平臺(tái),JavaServerPages(JSP)技術(shù)公諸于眾,J2SE平臺(tái)開始支持Linux操作系統(tǒng)。Java的起源與發(fā)展(續(xù))2000年5月8日,J2SE1.3發(fā)布。2001年9月24日,J2EE1.3發(fā)布。2002年2月26日,J2SE1.4發(fā)布。2004年9月30日,J2SE1.5發(fā)布,是Java語(yǔ)言發(fā)展史上的又一里程碑事件。2007年,JavaSE1.6發(fā)布,其計(jì)算性能又得到了進(jìn)一步的提升,開始支持腳本(script)語(yǔ)言并進(jìn)一步加強(qiáng)對(duì)多核CPU的支持。4搭建開發(fā)環(huán)境學(xué)習(xí)型環(huán)境文本編輯(EJE)JDK開發(fā)型環(huán)境NetBeansEclipse搭建開發(fā)環(huán)境安裝軟件文本編輯器件JDK設(shè)置環(huán)境變量PATHCLASSPATH注意事項(xiàng)安裝路徑不要有空格、漢字不要裝在操作系統(tǒng)分區(qū)中JDK安裝動(dòng)畫演示動(dòng)畫演示(windows)動(dòng)畫演示(linux)5HelloWorld案例輸入代碼并保存(文件名為Test.java)classHelloWorld{ publicstaticvoidmain(String[]args){System.out.println("HelloWorld!"); }}編譯javacTest.java運(yùn)行javaHelloWorld動(dòng)畫演示案例分析Java程序源代碼區(qū)分英文字母的大小寫Java源代碼文件必須以.java作為擴(kuò)展名一個(gè)源代碼文件至多包含一個(gè)public類,若在源代碼文件中定義了public類,則源代碼文件的文件名必須與public類的類名相同(包括英文字母的大小寫也要相同);若在源代碼文件中沒(méi)有定義public類,則源代碼文件的文件名任意。編譯過(guò)程運(yùn)行過(guò)程main方法6JDKAPIDoc該文檔的重要性JDKAPI文檔是Sun公司為JDK平臺(tái)提供的一套完整的API文檔資料,無(wú)論在學(xué)習(xí)階段還是在實(shí)際軟件開發(fā)過(guò)程中,該文檔都是必備文檔,以供編程者查閱參考。獲取該文檔的途徑本書配套實(shí)訓(xùn)的附帶光盤;也可以從直接下載。JDKAPIDoc(續(xù))7Java學(xué)習(xí)建議打好基礎(chǔ)眼手腦并用勤于參考JDKAPI文檔有效使用網(wǎng)絡(luò)資源計(jì)算機(jī)英語(yǔ)小結(jié)介紹了Java的起源和發(fā)展Java開發(fā)環(huán)境的搭建HelloWorld入門程序JDKAPI文檔的使用方法最后給出了學(xué)習(xí)Java的幾點(diǎn)建議。其中重點(diǎn)是Java開發(fā)環(huán)境、HelloWorld案例編程、JDKAPI文檔的使用方法等內(nèi)容,只有這些問(wèn)題徹底搞清楚了,后面的學(xué)習(xí)才會(huì)順暢。作業(yè)練習(xí)搭建開發(fā)環(huán)境理解環(huán)境變量的作用模仿HelloWorld程序,自己編寫一個(gè)簡(jiǎn)單的程序,輸出字符串“我喜歡Java”。習(xí)題1:1-10第2講:Java語(yǔ)言基礎(chǔ)(1)內(nèi)容提要注釋關(guān)鍵字標(biāo)識(shí)符基本數(shù)據(jù)類型字面值與常量變量教學(xué)目標(biāo)與重點(diǎn)、難點(diǎn)目標(biāo)能按照程序編寫規(guī)范,熟練編寫簡(jiǎn)單Java應(yīng)用程序。正確定義與使用變量、常量,正確使用運(yùn)算符與表達(dá)進(jìn)行數(shù)值計(jì)算程序的處理。重點(diǎn)都是難點(diǎn)基本數(shù)據(jù)類型字面值與常量變量1注釋單行注釋//多行注釋/*…*/文檔注釋/**…*/2關(guān)鍵字abstractconstfinalinstanceofprivateswitchvoidbooleancontinuefinallyintprotectedsynchronizedvolatilebreakdefaultfloatinterfacepublicthiswhilebytedoforlongreturnthrowassert關(guān)鍵字(續(xù))casedoublegotonativeshortthrowscatchelseifnewstatictransientcharextendsimplementsnullstrictfptrueclassfalseimportpackagesupertry續(xù)表3標(biāo)識(shí)符命名原則字母、數(shù)字、下劃線、$首字符不能是數(shù)字字面區(qū)分大小寫JDK內(nèi)置多國(guó)語(yǔ)言引起的變化:$可用其他國(guó)家的貨幣符號(hào)(如£、¥)來(lái)代替可以使用漢字或其他國(guó)家文字作為標(biāo)識(shí)符建議仍遵循原來(lái)的命名原則4基本數(shù)據(jù)類型數(shù)據(jù)類型位長(zhǎng)(bits)取值范圍boolean1true,falsebyte8-27~27-1char16'\u0000'~'\uffff'short16-215~215-1int32-231~231-1long64-263~263-1float32±1.4E-45,±3.4028235E+38double64±4.9E-324,±1.7976931348623157E+3085字面值與常量字面值(literal)是指在程序源代碼中直接給出的一個(gè)數(shù)據(jù)值(數(shù)值或字符串),目的是為變量賦值或參與表達(dá)式運(yùn)算。常量(也稱不變量)是指采用修飾符final修飾的一個(gè)變量名(屬于標(biāo)識(shí)符)。將一個(gè)變量名采用final修飾為常量,然后賦給它一個(gè)字面值,這就在二者之間畫上了等號(hào)。例如:finalinta=123;char字面值一對(duì)單引號(hào)構(gòu)成,例如‘a(chǎn)’‘中’注意與字符串字面值區(qū)分“abcde”還包括轉(zhuǎn)義符char字面值——轉(zhuǎn)義符轉(zhuǎn)義符含義unicode編碼轉(zhuǎn)義符含義unicode編碼\'單引號(hào)\u0027\"雙引號(hào)\u0022\\反斜杠\u005c\b退格\u0008\f換紙走頁(yè)\u000c\n換行newline\u000a\r回車\u000d\t水平制表符tab\u00096變量該部分包括:變量的含義變量的聲明變量的作用域變量的初始化6.1變量的含義在程序運(yùn)行期間,系統(tǒng)為程序分配一塊內(nèi)存單元,用于存儲(chǔ)對(duì)應(yīng)類型的數(shù)據(jù)。系統(tǒng)分配的內(nèi)存單元在程序源代碼中采用一個(gè)變量來(lái)標(biāo)識(shí)。用一個(gè)變量標(biāo)識(shí)一塊內(nèi)存單元后,程序就可以使用變量名代表這塊內(nèi)存單元中的數(shù)據(jù),即變量名標(biāo)識(shí)內(nèi)存單元,變量的值就是存儲(chǔ)在內(nèi)存單元中的數(shù)據(jù)。6.2變量的聲明變量的使用分為變量的聲明和變量的賦值兩個(gè)步驟,這兩個(gè)步驟是有先后順序的,即先聲明后賦值。聲明變量的語(yǔ)法有多種形式:datatypevarname; //聲明一個(gè)變量
datatypevarName=value;//聲明變量的同時(shí)賦值
datatypevar1,var2,...,varN;//同時(shí)聲明多個(gè)變量
datatypevar1=val1,var2=val2,...,varN=valN;6.3變量的作用域變量的作用域就是一個(gè)變量起作用的代碼區(qū)域范圍或者有效范圍。{}內(nèi)部的代碼稱為代碼塊或者塊語(yǔ)句,代碼塊決定了在其中定義的變量的作用域。例如:1{
2intx=0;inta=2;
3{
4inta=1;//錯(cuò)誤
5inty=0;
6y=y+1;
7x=2;//正確
8}
9x=x+1;
10y=3;//錯(cuò)誤
11}6.4變量的初始化Java中變量分為對(duì)象成員變量和方法局部變量,對(duì)象成員變量放在面向?qū)ο蟛糠衷僦v,對(duì)于方法局部變量,在使用之前必須完成初始化,所謂初始化就是給變量賦初始值。例如:1//LocalVarInitTest.java
2publicclassLocalVarInitTest{
3publicstaticvoidmain(String[]args){
4intx;
5inty=x+1;//錯(cuò)誤
6}
7}小結(jié)注釋關(guān)鍵字標(biāo)識(shí)符基本數(shù)據(jù)類型字面值與常量變量作業(yè)習(xí)題2:1,3,4,5,6第3講:Java語(yǔ)言基礎(chǔ)(2)內(nèi)容提要基本類型的類型轉(zhuǎn)換強(qiáng)制類型轉(zhuǎn)換自動(dòng)類型轉(zhuǎn)換數(shù)組使用數(shù)組的基本步驟步驟組合多維數(shù)組數(shù)組處理工具數(shù)組的優(yōu)缺點(diǎn)教學(xué)要求1.正確理解類型轉(zhuǎn)換機(jī)制并能夠熟練編程處理。2.理解數(shù)組的原理,并能夠熟練使用數(shù)組進(jìn)行編程。1基本類型的類型轉(zhuǎn)換類型轉(zhuǎn)換的必要性在實(shí)際編程過(guò)程中經(jīng)常需要把一種類型的數(shù)據(jù)賦給另一種類型的變量,或者對(duì)不同類型的數(shù)據(jù)進(jìn)行運(yùn)算,這時(shí)就需要進(jìn)行類型的轉(zhuǎn)換。強(qiáng)制類型轉(zhuǎn)換也稱為顯式類型轉(zhuǎn)換,當(dāng)被轉(zhuǎn)換數(shù)據(jù)的類型取值范圍大于目標(biāo)類型的取值范圍時(shí),就需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換,其語(yǔ)法格式如下:(目標(biāo)類型)被轉(zhuǎn)換的數(shù)據(jù)舉例:intk=3;
byteb=(byte)k;強(qiáng)制類型轉(zhuǎn)換注意事項(xiàng)強(qiáng)制類型轉(zhuǎn)換是從高類型向低類型轉(zhuǎn)換,轉(zhuǎn)換后的結(jié)果可能會(huì)出現(xiàn)兩個(gè)問(wèn)題:(1)精度損失。浮點(diǎn)型→整型,則小數(shù)丟失,例如intb=(int)12.12。(2)溢出問(wèn)題。當(dāng)被轉(zhuǎn)換數(shù)據(jù)超出了目標(biāo)類型的取值范圍時(shí)會(huì)發(fā)生溢出問(wèn)題,例如byteb=(byte)123456789.12。自動(dòng)類型轉(zhuǎn)換自動(dòng)類型轉(zhuǎn)換也稱為隱式類型轉(zhuǎn)換,在8個(gè)基本類型中只有數(shù)值型的數(shù)據(jù)能夠進(jìn)行自動(dòng)類型轉(zhuǎn)換,且源數(shù)據(jù)的類型取值范圍小于目標(biāo)類型的取值范圍,即
byte<short <int<long<float<double
(*)char <int<long<float<double(*)按照從左到右的順序能夠進(jìn)行自動(dòng)轉(zhuǎn)換。類型轉(zhuǎn)換注意事項(xiàng)(1)無(wú)論是自動(dòng)轉(zhuǎn)換還是強(qiáng)制轉(zhuǎn)換,轉(zhuǎn)換的只是變量或者表達(dá)式的“讀出值”,而變量或者表達(dá)式自身的類型和值都未被改變。(2)自動(dòng)類型轉(zhuǎn)換順序(*)中注意short和char雖然都占用16bits,但地位不是對(duì)等的,例如:1bytea=97;
2shorts=a;//該行正確,發(fā)生了類型自動(dòng)轉(zhuǎn)換
3charc=97;//該行正確,變量c的值是字符'a'
4c=a;//該行編譯不通過(guò),原因可能是損失精度
5c=s;注意事項(xiàng)(續(xù))(3)int類型轉(zhuǎn)換為float,當(dāng)有效數(shù)字個(gè)數(shù)超過(guò)8個(gè);或者將long類型轉(zhuǎn)換為double,當(dāng)有效數(shù)字個(gè)數(shù)超過(guò)18個(gè),就會(huì)發(fā)生精度損失,例如:inti=1234567890;
floatf=i;//此時(shí)f=1.23456794E9,而不是1234567890.0(4)由float向double類型轉(zhuǎn)換時(shí),如果使用了關(guān)鍵字strictfp,則精度不會(huì)有損失,否則精度可能有損失。2數(shù)組數(shù)組的概念數(shù)組是一種集合數(shù)據(jù)類型,它是由類型相同的數(shù)據(jù)組成的有序數(shù)據(jù)集合,在Java中數(shù)組是對(duì)象,繼承了Object類并實(shí)現(xiàn)了Cloneable、java.io.Serializable接口,從而Object中的方法可被繼承到數(shù)組中使用。數(shù)組的變成步驟聲明分配空間初始化2.1聲明數(shù)組語(yǔ)法格式為:datatype[]varName;
datatypevarName[];//也可以把[]放在varName的后面注:[]的前后可以有零個(gè)、一個(gè)或多個(gè)空格。其中的datatype可以是基本數(shù)據(jù)類型(8個(gè)),也可以是引用類型(包括類、抽象類、接口)。例如:int[]a;
int[]b;
Stringc[];
Objectd[];方括號(hào)[]在數(shù)組變量名的前后都可以,建議采用在變量名前的方式。2.2分配空間語(yǔ)法格式為:變量名=new類型[數(shù)組長(zhǎng)度];例如:a=newint[3];//分配了3個(gè)內(nèi)存空間
b=newint[4];
c=newString[2];只有創(chuàng)建Java對(duì)象時(shí)才使用new關(guān)鍵字,從這一點(diǎn)也可看出,數(shù)組是Java對(duì)象。2.3初始化初始化就是為數(shù)組的成員賦初始值,一般采用for循環(huán),例如:for(inti=0;i<a.length;i++){//盡量不要采用i<3,應(yīng)盡量采用a.length
a[i]=2;
}注意數(shù)組的索引(index)是從0開始的,索引的類型是int,故byte、short、char、int類型的變量可以作為索引變量使用。a.length是使用了數(shù)組對(duì)象的length屬性,length的值是在分配空間階段由系統(tǒng)根據(jù)分配空間的大小來(lái)自動(dòng)賦值的。對(duì)數(shù)組的越界訪問(wèn)是不允許的,雖然編譯代碼沒(méi)有問(wèn)題,但運(yùn)行過(guò)程中Java會(huì)進(jìn)行是否越界訪問(wèn)檢查,一旦發(fā)現(xiàn)越界訪問(wèn),則拋出ArrayIndexOutOfBoundsException異常,關(guān)于異常處理請(qǐng)?jiān)斠姷?章數(shù)組使用的組合上述三個(gè)步驟是使用數(shù)組編程的三個(gè)基本步驟,這三個(gè)步驟可以組合在一起,其組合方式有:2.1+2.22.2+2.32.1+2.2+2.3
組合:2.1+2.2語(yǔ)法為:類型[]變量名=new類型[數(shù)組長(zhǎng)度];類型變量名[]=new類型[數(shù)組長(zhǎng)度];//也可以這樣例如:int[]a=newint[3];
intb[]=newint[4];組合:2.2+2.3語(yǔ)法為:變量名=new類型[]{值1,值2,...,值n};類型[]變量名={值1,值2,...,值n};例如:a=newint[]{1,2,3};//這稱為動(dòng)態(tài)創(chuàng)建數(shù)組
b={1,2,4,3};//這稱為靜態(tài)創(chuàng)建數(shù)組組合:2.1+2.2+2.3語(yǔ)法為:類型[]變量名=new類型[]{值1,值2,..,值n};類型[]變量名={值1,值2,..,值n};例如:int[]a=newint[]{1,2,3};
int[]b=newint[3]{1,2,3};//錯(cuò)誤
doubled={1.1,2.1,3.0};多維數(shù)組Java并不存在真正的多維數(shù)組,所謂的多維數(shù)組是由多個(gè)一維數(shù)組嵌套合成的,即把多維數(shù)組看作是數(shù)組的數(shù)組,使用這種方法把多維數(shù)組逐一分解,直到分解成一維數(shù)組為止。這種機(jī)制使得Java多維數(shù)組具有很強(qiáng)的靈活性。多維數(shù)組編程同樣遵循前面介紹的三個(gè)基本步驟,其組合方式同樣適用于多維數(shù)組。多維數(shù)組例程1/*聲明*/
2int[][]a;
3int[]b[];
4intc[][];
5int[][]d;
6
7/*分配空間*/
8a=newint[2][3];//2行3列
9
10/*下面代碼只分配了3行,沒(méi)有分配列,此時(shí)b是一維數(shù)組,
11*其長(zhǎng)度為3,而b的每個(gè)元素又是一維數(shù)組,其空間還未分配。
12*/
13b=newint[3][];
14/*下面代碼為b的每個(gè)元素分配空間*/
15b[0]=newint[3];//或b[0]=newint[]{1,2,3},或b[0]={1,2,3}
16b[1]=newint[2];
17b[2]=newint[1];
18
例程(續(xù))19/*初始化*/
20for(inti=0;i<a.length;i++){
21for(intj=0;j<a[i].length;j++){
22a[i][j]=i+j;
23}
24}
25
26for(inti=0;i<b.length;i++){
27for(intj=0;j<b[i].length;j++){
28b[i][j]=i+j;
29}
30}
31
32/*靜態(tài)初始化,分配空間與賦初值同時(shí)完成*/
33c={{1,2},{5}};
34
35/*動(dòng)態(tài)分配空間與賦初值同時(shí)完成*/
36d=newint[][]{{1,2},{0},{3,4}};數(shù)組處理工具java.util.Arrays類是專門用于操作數(shù)組的,提供了搜索、排序、復(fù)制等靜態(tài)方法。Arrays類中常用的方法如下:equals():比較兩個(gè)數(shù)組是否相等,所謂兩個(gè)數(shù)組相等是指兩個(gè)數(shù)組擁有相同的元素個(gè)數(shù),且所有對(duì)應(yīng)元素相等。fill():將值填入數(shù)組中。sort():用來(lái)對(duì)數(shù)組進(jìn)行排序。binarySearch():在排好序的數(shù)組中尋找元素。另外一個(gè)工具是System.arraycopy(),用于對(duì)數(shù)組進(jìn)行復(fù)制。數(shù)組的優(yōu)缺點(diǎn)數(shù)組的優(yōu)點(diǎn)是數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單,能夠進(jìn)行隨機(jī)訪問(wèn),且訪問(wèn)的速度很快。其缺點(diǎn)有:(1)數(shù)組一旦分配了空間,其大小就不能再改變。(2)數(shù)組中所有元素的數(shù)據(jù)類型都必須相同。(3)不能對(duì)數(shù)組實(shí)施插入或者刪除操作。(4)無(wú)法判斷數(shù)組中實(shí)際存在有多少元素,length只是告訴數(shù)組的容量。若讀者在編程時(shí)需要上述特征,則不能使用數(shù)組,而是使用JavaCollection框架(Framework)類,詳見第8章。小結(jié)基本類型的類型轉(zhuǎn)換強(qiáng)制類型轉(zhuǎn)換自動(dòng)類型轉(zhuǎn)換數(shù)組使用數(shù)組的基本步驟步驟組合多維數(shù)組數(shù)組處理工具數(shù)組的優(yōu)缺點(diǎn)作業(yè)習(xí)題27,9,10,11第4講:方法與包內(nèi)容提要方法方法的參數(shù)傳遞方法的可變參數(shù)格式化輸出包importpackage教學(xué)要求重點(diǎn)掌握:方法的參數(shù)傳遞原則使用import/package語(yǔ)句的程序代碼的編譯、執(zhí)行過(guò)程。這也是一個(gè)難點(diǎn)。1方法的參數(shù)傳遞Java方法的參數(shù)傳遞所遵循的規(guī)則棧內(nèi)容拷貝傳遞。要理解這個(gè)規(guī)則需要首先弄清楚Java對(duì)內(nèi)存的劃分管理。Java把內(nèi)存分為棧(stack)和堆(heap)兩部分。棧是Java訪問(wèn)內(nèi)存的入口,對(duì)堆的訪問(wèn)是通過(guò)棧完成的。在棧中存放變量的值,若變量是基本類型的,則變量的值就是數(shù)據(jù)本身,這時(shí)Java直接把數(shù)據(jù)放在棧中;若變量是引用類型的,則會(huì)在堆中開辟一塊連續(xù)的區(qū)域用來(lái)存放對(duì)象,并把對(duì)象的首地址放在棧中,即變量的值是對(duì)象的首地址。所謂棧內(nèi)容拷貝傳遞就是把棧中變量的值拷貝了一份,然后把副本傳給了方法參數(shù)。代碼演示21inti=10;
22t.methodOne(i);
23System.out.println("i="+i);26Aa=newA();
27t.methodTwo(a);
28System.out.println("a.k="+a.k);30Strings="abc";
31t.methodThree(s);
32System.out.println("s="+s);方法的可變參數(shù)所謂可變參數(shù)就是指方法的參數(shù)個(gè)數(shù)不是固定的,而是變化的,可以是零個(gè),也可以是任意正整數(shù)個(gè)。其聲明的語(yǔ)法如下:methodName(VarParaType...var){
//...
}例如:voidf(inta,Stringb,int...var){}
voidg(String...str){}可以這樣調(diào)用上面的方法:g();
g("abc");
g("a","b");
g("a","b","c");格式化輸出publicPrintStreamprintf(Stringformat,Object...args)舉例4//定義一些變量,用來(lái)格式化輸出
5doubled=345.678;
6Strings="你好!";
7inti=1234;
8
9//"%"表示進(jìn)行格式化輸出,"%"之后的內(nèi)容為格式的定義
10System.out.printf("%f\n",d);//"f"表示格式化輸出浮點(diǎn)數(shù)舉例(續(xù))12//"9.2"中的9表示輸出的長(zhǎng)度,2表示小數(shù)點(diǎn)后的位數(shù)
13System.out.printf("%9.2f\n",-d);
14
15System.out.printf("%+9.2f\n",d);//"+"表示輸出的正數(shù)帶正號(hào)
16
17//"-"表示輸出的數(shù)左對(duì)齊(默認(rèn)為右對(duì)齊)
18System.out.printf("%-9.4f\n",d);
19
20//"+-"表示輸出的數(shù)帶正負(fù)號(hào)且左對(duì)齊
21System.out.printf("%+-9.3f\n",d);
22
23System.out.printf("%d\n",i);//"d"表示輸出十進(jìn)制整數(shù)
24System.out.printf("%o\n",i);//"o"表示輸出八進(jìn)制整數(shù)
25System.out.printf("%x\n",i);//"x"表示輸出十六進(jìn)制整數(shù)
26
舉例(續(xù))27//"#x"表示輸出帶有十六進(jìn)制標(biāo)志的整數(shù)
28System.out.printf("%#x\n",i);
29
30System.out.printf("%s\n",s);//"s"表示輸出字符串
31
32//可以輸出多個(gè)變量,注意順序
33System.out.printf("輸出一個(gè)浮點(diǎn)數(shù):"+34"%f,一個(gè)整數(shù):%d,一個(gè)字符串:%s\n",d,i,s);
35
36//"k$"表示格式字符串之后的第k個(gè)參數(shù),k是具體數(shù)字
37System.out.printf("字符串:%2$s,%1$d的十六進(jìn)制數(shù):%1$#x",i,s);
38
包Java采用包機(jī)制的原因packageimportpackagepackage語(yǔ)句首先看一個(gè)例子:1packageabc.d;
2classTestPackage{
3publicstaticvoidmain(String[]args){
4System.out.println("Youareright!");
5}
6}編譯、運(yùn)行javac-dC:\testTestPackage.java
java-cpC:\testabc.d.TestPackageimport與importstaticimportstaticpkg.ClassName.staticMember;
importstaticpkg.ClassName.*;//也可以這樣
例如:1importstaticjava.lang.System.*;
2//不可import靜態(tài)屬性的靜態(tài)成員,如下行代碼所示
3//importstaticjava.lang.System.out.*;//error
4//importstaticSystem.*;//java.lang不可以省略小結(jié)方法方法的參數(shù)傳遞方法的可變參數(shù)格式化輸出包importpackage作業(yè)習(xí)題22,8,13第5講:運(yùn)算符與流程控制內(nèi)容提要Java運(yùn)算符算術(shù)比較邏輯位賦值Java流程控制順序分支循環(huán)跳轉(zhuǎn)教學(xué)要求熟練掌握運(yùn)算符和流程控制的編程語(yǔ)法。1Java運(yùn)算符——算術(shù)運(yùn)算符算術(shù)運(yùn)算符有+、-、*、/、%、++、--。(1)+,有三種功能:正號(hào)、加號(hào)和字符串連接。(2)-,有兩種功能:負(fù)號(hào)和減號(hào)。(3)*,要注意乘法運(yùn)算后結(jié)果是否超出了類型的取值范圍,例如:inta=123456,b=2345678,c;
c=a*b/b;//結(jié)果不是123456,而是778(4)/,當(dāng)左右兩個(gè)操作數(shù)都是整型數(shù)時(shí),/表示的是整除(5)%(取余運(yùn)算符),其計(jì)算結(jié)果的符號(hào)只與第一個(gè)操作數(shù)的符號(hào)相同,與第二個(gè)操作數(shù)的符號(hào)無(wú)關(guān),例如10%3=1,10%-3=1,-10%3=-1,-10%-3=-1,-10.3%3=-1.3。%的操作數(shù)可以是整數(shù)也可以實(shí)浮點(diǎn)數(shù)。比較運(yùn)算符該運(yùn)算符對(duì)左右兩端的操作數(shù)進(jìn)行比較,運(yùn)算結(jié)果是boolean類型的。比較運(yùn)算符有==(相等)、!=(不等)、<、<=、>、>=、instanceof。注意:==與=不同,前者是比較操作符,后者是賦值操作符,例如booleanb=false;
if(b=true){//賦值
System.out.println("Hello");
}
if(b==true){//比較
System.out.println("World");
}邏輯運(yùn)算符運(yùn)算符名稱說(shuō)明!NOT(非)!true為false,!false為true&&AND(短路與)左右都是true時(shí),結(jié)果為true,否則為false||OR(短路或)只要有一者是true,結(jié)果就是true,否則為false&AND(非短路與)同&&|OR(非短路或)同||位運(yùn)算符運(yùn)算符功能運(yùn)算符功能~
按位(bit)非
|按位或
&按位與
按位異或
<<左移,右端移空的低位補(bǔ)
0>>帶符號(hào)右移,左端移空的高位填補(bǔ)的數(shù)值和原來(lái)左端最高位相同>>>無(wú)符號(hào)右移,左端移空的高位補(bǔ)
0位運(yùn)算符的幾點(diǎn)說(shuō)明(1)位運(yùn)算符可以與=組合使用,例如a>>=2,a&=b,…。(2)位運(yùn)算只適用于byte,char,short,int,long類型的數(shù)據(jù)。(3)位運(yùn)算不會(huì)對(duì)原數(shù)據(jù)實(shí)施操作,而是對(duì)原數(shù)據(jù)的副本實(shí)施操作,例如inta=10;a>>1;則a的值不變。(4)移位運(yùn)算的操作數(shù)如果類型不一致,則會(huì)發(fā)生類型的自動(dòng)提升,例如a>>b,提升規(guī)則為:若a,b的類型都低于int,則自動(dòng)提升為int型,否則運(yùn)算結(jié)果的類型和a,b中的最高類型一致。(5)對(duì)移位運(yùn)算而言,例如a>>b,若a為int型,則實(shí)際移動(dòng)的位數(shù)為b%32,例如inta=10;a<<1與a<<33的結(jié)果相同。若a的類型為long,則實(shí)際移動(dòng)的位數(shù)為b%64。(6)a>>1與a/2的結(jié)果相同,a<<1與的結(jié)果相同,只是移位運(yùn)算的速度快。賦值運(yùn)算符賦值運(yùn)算符為=,可以單獨(dú)使用,例如a=10,也可以與其他運(yùn)算符組合使用,若其他運(yùn)算符統(tǒng)一抽象用⊙表示,則a⊙=b在功能上和a=a⊙b相同,例如a+=3同a=a+3??山M合使用的運(yùn)算符有:+、-、*、/、%、&、|、?、<<、>>、>>>。賦值可以連續(xù)使用,例如inta,b,c,d;a=b=c=d=10;連續(xù)賦值時(shí),賦值順序自右向左。運(yùn)算符的優(yōu)先級(jí)上述的各種運(yùn)算符之間是有優(yōu)先級(jí)的,但本著程序代碼的易讀性,我們不必要知道他們的優(yōu)先級(jí)。舉例inta=20;
b=a+++a/4;
流程控制Bohra和Jacopini提出了程序設(shè)計(jì)的三種基本結(jié)構(gòu):順序結(jié)構(gòu)、條件分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu),并從理論上證明了一切可描述的程序算法均可通過(guò)使用這三種結(jié)構(gòu)得到解決。順序結(jié)構(gòu)順序結(jié)構(gòu)是程序設(shè)計(jì)中最基本最簡(jiǎn)單的結(jié)構(gòu),一切程序設(shè)計(jì)算法,歸結(jié)到計(jì)算機(jī)指令,都是順序執(zhí)行的,順序結(jié)構(gòu)要求按順序執(zhí)行每一條指令。條件分支結(jié)構(gòu)if語(yǔ)句條件表達(dá)式switch語(yǔ)句if語(yǔ)句if語(yǔ)句有以下幾種表現(xiàn)形式:(1)if(boolean表達(dá)式){
語(yǔ)句塊;
}(2)if(boolean表達(dá)式){
語(yǔ)句塊1;
}else{
語(yǔ)句塊2
}(3)if(boolean表達(dá)式1){
語(yǔ)句塊1;
}elseif(boolean表達(dá)式2){
語(yǔ)句塊2;
}
elseif(boolean表達(dá)式n){
語(yǔ)句塊n;
}else{
語(yǔ)句塊n+1
}(4)if語(yǔ)句的嵌套。if語(yǔ)句可以嵌套使用以表達(dá)更復(fù)雜的條件判斷。如:if(a==2){
if(b==3){
語(yǔ)句塊1;
}else{
語(yǔ)句塊2;
}
語(yǔ)句塊3;
}條件表達(dá)式語(yǔ)法為:表達(dá)式1?表達(dá)式2:表達(dá)式3;含義是若表達(dá)式1的結(jié)果為true,則執(zhí)行表達(dá)式2并返回其值,否則執(zhí)行表達(dá)式3并返回其值。條件表達(dá)式相當(dāng)于if…else…結(jié)構(gòu),例如:intx=-10;
intabsX=x>0?x:-x;//執(zhí)行完后absX=10switch語(yǔ)句switch(表達(dá)式){
case常量表達(dá)式1:
語(yǔ)句塊1;
break;
case常量表達(dá)式2:
語(yǔ)句塊2;
break;
case常量表達(dá)式n:
語(yǔ)句塊n;
break;
default:
語(yǔ)句塊n+1;
break;
}說(shuō)明(1)switch表達(dá)式的類型只能是byte、char、short、int中的一種。(2)case語(yǔ)句后常量表達(dá)式的類型與switch表達(dá)式的類型一致,常量表達(dá)式中不能含有變量。(3)break語(yǔ)句為可選項(xiàng),放在每個(gè)case語(yǔ)句塊的末尾,當(dāng)執(zhí)行break語(yǔ)句后,就會(huì)結(jié)束switch語(yǔ)句的執(zhí)行。若沒(méi)有break語(yǔ)句,則會(huì)繼續(xù)執(zhí)行后續(xù)的case分支語(yǔ)句,直到遇到break語(yǔ)句或switch語(yǔ)句結(jié)束。(4)default語(yǔ)句的數(shù)量可為0或1,case語(yǔ)句的數(shù)量可為0或1或多個(gè)。default與case語(yǔ)句之間沒(méi)有先后順序,只是習(xí)慣上把default語(yǔ)句放在最后。循環(huán)結(jié)構(gòu)Java的循環(huán)結(jié)構(gòu)有三種:whiledo…whilefor循環(huán)。whilewhile(boolean表達(dá)式){
循環(huán)體;
}含義是首先計(jì)算boolean表達(dá)式的值,若為true則執(zhí)行循環(huán)體,直到boolean表達(dá)式的值變?yōu)閒alse為止。注意boolean表達(dá)式不能為字面常量false,試比較booleanb=false;
while(b){//正確,但該循環(huán)體一次也得不到執(zhí)行
}
while(false){//編譯錯(cuò)誤,在程序中該段代碼的存在沒(méi)有任何意義
}dowhile循環(huán)do{
循環(huán)體;
}while(boolean表達(dá)式);for循環(huán)for(表達(dá)式1;表達(dá)式2;表達(dá)式3){
循環(huán)體;
}表達(dá)式1表達(dá)式2循環(huán)體表達(dá)式3truefalse退出循環(huán)優(yōu)化的for循環(huán)從JDK5.0開始新增加了for循環(huán)的一種新用法,稱為優(yōu)化的for循環(huán),用于遍歷數(shù)組或者集合對(duì)象,集合詳見8.2.2節(jié)。例如:String[]s={"a","b","c"};//對(duì)象類型的數(shù)組
for(Stringi:s){
//i是s的元素變量,變量i需要聲明其類型,即s的元素的類型。
//s可以是數(shù)組或者集合。
System.out.println(i);
}
int[]i={1,2,3};//基本類型的數(shù)組
for(intk:i){
System.out.println(k);
}跳轉(zhuǎn)語(yǔ)句break語(yǔ)句continue語(yǔ)句return語(yǔ)句break語(yǔ)句break語(yǔ)句可以中斷switch語(yǔ)句或循環(huán)語(yǔ)句的執(zhí)行。break語(yǔ)句分為帶標(biāo)號(hào)和不帶標(biāo)號(hào)兩種形式,其格式為:break[標(biāo)號(hào)];int[]a={1,2,3};
lab1:while(true){
for(inti=0;i<a.length;i++){
if(a[i]<0)
break;//跳出當(dāng)前的for循環(huán)
elseif(a[i]==0)
breaklab1;//跳出lab1標(biāo)記的while循環(huán)
}
}continue語(yǔ)句continue語(yǔ)句只適用于循環(huán)體語(yǔ)句,其功能是終止當(dāng)前這一輪循環(huán),不再繼續(xù)執(zhí)行continue語(yǔ)句后面的語(yǔ)句,而直接進(jìn)入下一輪的循環(huán)。其格式為:continue[標(biāo)號(hào)];intk=0;
int[]a={1,2,3,-1,0};
lab2:while(k<100){
for(inti=;i<a.length;i++){
if(a[i]<0)
continue;//跳到i++
elseif(a[i]==0)
continuelab2;//跳到lab2處
}
}return語(yǔ)句return語(yǔ)句用在方法中,其功能是終止當(dāng)前方法的繼續(xù)執(zhí)行,并返回到調(diào)用該方法的位置之后。其格式為:return[表達(dá)式];小結(jié)Java運(yùn)算符算術(shù)比較邏輯位賦值Java流程控制順序分支循環(huán)跳轉(zhuǎn)作業(yè)編程輸出:Fibonacci數(shù)列。編程為學(xué)生成績(jī)分類:不及格:0-59及格:60-69中:70-79良:80-89優(yōu):90-100第6講:面向?qū)ο螅?)內(nèi)容提要人與計(jì)算機(jī)的關(guān)系物理世界與面向?qū)ο箢惻c對(duì)象面向?qū)ο蠡咎卣鞣庋b訪問(wèn)修飾符繼承多態(tài)重載覆蓋教學(xué)要求物理世界與面向?qū)ο蟮乃枷?、方法?jì)算機(jī)面向?qū)ο蟮乃枷?、方法如何定義一個(gè)類以及創(chuàng)建其實(shí)例面向?qū)ο蟮娜齻€(gè)基本特征人與計(jì)算機(jī)的關(guān)系人處于主體地位,計(jì)算機(jī)只能處于從屬地位。計(jì)算機(jī)必須能夠模擬這個(gè)物理世界。計(jì)算機(jī)是個(gè)小世界,而物理世界是個(gè)大世界,小世界來(lái)源于大世界物理世界的認(rèn)知(1)世界由萬(wàn)物構(gòu)成。(2)事物是運(yùn)動(dòng)的、發(fā)展的、變化的。(3)事物之間的關(guān)系是復(fù)雜的、多變的。事物的基本特征(1)封裝。保護(hù)功能相對(duì)獨(dú)立性(2)繼承加快事物發(fā)展的速度提高事物發(fā)展的質(zhì)量(3)多態(tài)。透過(guò)現(xiàn)象抓本質(zhì),以不變應(yīng)萬(wàn)變。事物間的關(guān)系泛化關(guān)系(Generalization)聚合關(guān)系(Aggregation)組合關(guān)系(Composition)依賴關(guān)系(Dependency)關(guān)聯(lián)(Association)。類與對(duì)象世界由萬(wàn)物構(gòu)成,經(jīng)由前面的學(xué)習(xí),我們知道研究物理世界要用分類的方法。在面向?qū)ο蟪绦蛟O(shè)計(jì)中用類(class)來(lái)模擬一類事物。類的定義需用關(guān)鍵字class,定義一個(gè)簡(jiǎn)單類的語(yǔ)法如下:class類名{//該行稱為類頭,大括號(hào)之間的部分稱為類體
零或多個(gè)屬性;
零或多個(gè)方法;
}其中屬性的定義格式有兩種,如下:(1)類型屬性名[=屬性值];(2)類型屬性名1[=屬性值1],屬性名2[=屬性值2],...;類定義舉例1classStudent{
2Stringsno;//學(xué)號(hào)
3Stringname,major;//姓名,專業(yè)
4intage;//年齡
5
6voidshowInfo(){
7System.out.println("學(xué)號(hào):"+sno+"\t姓名:"+name+
8"\t年齡:"+age+"\t專業(yè):"+major);
9}
10
11Student(){//第一種構(gòu)造方法
12}
13
14/*第二種構(gòu)造方法*/
15Student(Stringsno1,Stringname1,Stringmajor1,intage1){
16sno=sno1;
17name=name1;
18major=major1;
19age=age1;
20}
21}
22實(shí)例對(duì)象實(shí)例對(duì)象可以使用類的構(gòu)造方法和new關(guān)鍵字構(gòu)造出來(lái)。語(yǔ)法為:類名對(duì)象引用=new構(gòu)造方法;例如:Studentt=newStudent();類的成員1.成員屬性的定義成員屬性也稱為成員變量,定義一個(gè)成員屬性,格式為:[修飾符]類型成員屬性名[=成員屬性值];例如:inta=10;
intb;
Strings1;
Strings2=newString("abc");其中修飾符暫不講,詳見3.8節(jié)。2.成員方法的定義語(yǔ)法為:[修飾符]返回類型方法名([形式參數(shù)列表])
[throws異常類型列表]{//方法頭
執(zhí)行語(yǔ)句塊;//方法體
}成員變量的初始化成員變量類型默認(rèn)值成員變量類型默認(rèn)值
booleanfalsechar‘’(即空字符)byte,short,int0long0Lfloat0.0Fdouble0.0D引用類型
null構(gòu)造方法當(dāng)使用new關(guān)鍵字創(chuàng)建一個(gè)類實(shí)例對(duì)象時(shí),系統(tǒng)(JVM)會(huì)自動(dòng)調(diào)用該類的構(gòu)造方法來(lái)完成類實(shí)例對(duì)象的構(gòu)建,從而構(gòu)造方法對(duì)類定義來(lái)說(shuō)是必須的。那么我們?cè)陬愔腥绾温暶饕粋€(gè)構(gòu)造方法呢?如下:[訪問(wèn)修飾符]類名([參數(shù)列表]){
//
}構(gòu)造方法的幾點(diǎn)說(shuō)明(1)構(gòu)造方法的訪問(wèn)修飾符可以是public,protected或者缺?。床挥迷L問(wèn)修飾符),但不允許private。(2)構(gòu)造方法的名稱和類名相同,但沒(méi)有返回類型。(3)若沒(méi)有定義任何構(gòu)造方法,則在編譯階段編譯器會(huì)在編譯后的字節(jié)碼文件中插入一個(gè)默認(rèn)的構(gòu)造方法,默認(rèn)的構(gòu)造方法是:無(wú)參數(shù)列表,訪問(wèn)修飾符和類的訪問(wèn)修飾符相同,方法體內(nèi)為空。(4)構(gòu)造方法本身不能遞歸調(diào)用。(5)構(gòu)造方法體的最后一行語(yǔ)句可以是空的return語(yǔ)句,即“return;”,也可以不用return語(yǔ)句。(6)可在一個(gè)類中定義多個(gè)構(gòu)造方法,其區(qū)別在于參數(shù)列表不同,這是構(gòu)造方法的重載。關(guān)于重載,詳見3.5.1節(jié)。封裝的Java表達(dá)與訪問(wèn)修飾符封裝有兩個(gè)作用:保護(hù)作用和增強(qiáng)對(duì)象的獨(dú)立性。保護(hù)作用是通過(guò)設(shè)置訪問(wèn)修飾符來(lái)實(shí)現(xiàn)的。訪問(wèn)修飾符有4個(gè):public、protected、默認(rèn)訪問(wèn)修飾符、private。其中默認(rèn)訪問(wèn)修飾符就是沒(méi)有修飾符,即不用public、protected、private中的任何一個(gè)。訪問(wèn)修飾符用于對(duì)類、成員屬性和成員方法設(shè)置訪問(wèn)權(quán)限,對(duì)它們實(shí)施保護(hù)作用。訪問(wèn)修飾符(1)public可用于修飾類、成員變量和方法。表明該成員變量和方法是共有的,能在任何情況下被訪問(wèn)。Java應(yīng)用程序中的main()方法必須用public來(lái)修飾(否則能通過(guò)編譯,但不能運(yùn)行),就是為了使JVM能夠訪問(wèn)它。在一個(gè)源代碼文件中最多只能定義一個(gè)public類,且該類名必須和源代碼文件同名。(2)protected只能用于修飾成員屬性或成員方法,不能修飾類。用protected修飾的成員可以被同包(package)下其他類方法訪問(wèn),也可以被不同包下的子類方法訪問(wèn)。(3)默認(rèn)訪問(wèn)修飾符修飾的成員只能被同包下的類方法訪問(wèn)。(4)private修飾的成員只能被同類中的方法來(lái)訪問(wèn)。這4種訪問(wèn)修飾符的訪問(wèn)范圍由大到小,或安全保護(hù)程度由低到高依次是:public、protected、默認(rèn)訪問(wèn)修飾符、private。舉例1classT{
2privateStrings="abc";
3publicStringgetS(){//稱作訪問(wèn)方法
4returns;
5}
6}
7
8classTest{
9publicvoidfunc(){
10Tt=newT();
11Strings1=t.s;//非法
12Strings2=t.getS();//合法
13}
14}繼承繼承的作用:一是提高了軟件的開發(fā)速度,二是提高了開發(fā)軟件的質(zhì)量。繼承有廣義和狹義之分。廣義的繼承有些拿來(lái)主義的味道,因此在Java中分為橫向手法和縱向手法。橫向手法是指采用import語(yǔ)句來(lái)繼承要使用的類或Java接口;縱向手法是指采用extends關(guān)鍵字來(lái)實(shí)現(xiàn)的手法。狹義的繼承就是只指縱向手法。無(wú)論是橫向手法還是縱向手法都不違背繼承的兩個(gè)作用。在面向?qū)ο缶幊讨欣^承概念通常是指狹義的。舉例1classStudent{
2publicvoidfunc(){
3System.out.println("Student");
4}
5}
6
7classFreshmanextendsStudent{
8publicstaticvoidmain(String[]args){
9Freshmanb=newFreshman();
10
11/*能夠調(diào)用Freshman對(duì)象的func方法,
12*說(shuō)明func來(lái)自Student.
13*/
14b.func();
15}
16}Java不支持多重繼承,單繼承使Java的繼承關(guān)系很簡(jiǎn)單,一個(gè)類只能有一個(gè)父類,易于管理程序,同時(shí)一個(gè)類可以實(shí)現(xiàn)多個(gè)接口(詳見3.6節(jié)),從而克服單繼承的缺點(diǎn)。繼承描述的是一種isa關(guān)系,例如上例FreshmanisaStudent,是一種特殊與一般的關(guān)系。繼承是在兩個(gè)不同的類之間發(fā)生的一種關(guān)系,被繼承的內(nèi)容是建立在訪問(wèn)權(quán)限(受訪問(wèn)修飾符控制)可訪問(wèn)的基礎(chǔ)上的,有以下結(jié)論。(1)子類的訪問(wèn)修飾符不小于父類的訪問(wèn)修飾符(private<默認(rèn)<protected<public)。(2)private修飾的成員不可以被繼承。(3)默認(rèn)訪問(wèn)修飾符修飾的成員只能被同包下的其他類繼承。(4)構(gòu)造方法不能被繼承。父類+屬性1#屬性2-屬性3+方法()子類圖3.2類的繼承關(guān)系(5)不管父類是否是abstract的,子類可以聲明為abstract的,同樣,父類中的方法不管是否是abstract的,在子類中都可以把該方法聲明為abstract的。繼承的UML表示父類+屬性1#屬性2-屬性3+方法()子類圖3.2類的繼承關(guān)系this與super關(guān)鍵字this代表類實(shí)例對(duì)象自身,super代表父類實(shí)例對(duì)象。在一個(gè)類中可以定義多個(gè)構(gòu)造方法,若在一個(gè)構(gòu)造方法中調(diào)用另一個(gè)構(gòu)造方法時(shí),必須使用this。super不可以連續(xù)使用。多態(tài)的Java表達(dá)ava表達(dá)多態(tài)的方式有兩種:一是重載(overload)二是覆蓋(override)。重載重載是指在同一個(gè)類中定義多個(gè)同名方法,要求他們的參數(shù)列表不同。區(qū)分重載方法只能通過(guò)參數(shù)列表,例如:1classT{
2publicvoidfunc(){
3System.out.println("func()");
4func(10);//輸出結(jié)果為a=10
5}
6publicvoidfunc(inta){
7System.out.println("a="+a);
8}
9protectedintfunc(inta,intb){...}
10Stringfunc(Strings){...}
11}重載說(shuō)明重載方法對(duì)修飾符列表、返回類型、拋出異常類型(詳見第5章)是否相同均不作要求,區(qū)別僅僅在于參數(shù)列表。重載方法是程序的一種靜態(tài)結(jié)構(gòu),即重載方法之間的關(guān)系在編譯器編譯后就確定了,不會(huì)隨程序代碼的執(zhí)行來(lái)動(dòng)態(tài)確定,這一點(diǎn)和覆蓋不同,覆蓋是程序的一種動(dòng)態(tài)結(jié)構(gòu)。正是由于重載是一種靜態(tài)結(jié)構(gòu),所以完全可以把重載方法看作是各自不同的方法,這一點(diǎn)與不同名的方法之間的關(guān)系沒(méi)有什么區(qū)別。在一個(gè)重載方法內(nèi)可以直接調(diào)用另外一個(gè)重載方法,但在一個(gè)重載的構(gòu)造方法內(nèi)卻不能直接調(diào)用另一個(gè)重載的構(gòu)造方法,必須使用this。覆蓋覆蓋是指在具有繼承關(guān)系的兩個(gè)不同類中定義同名方法,是建立在繼承的基礎(chǔ)上的,要求如下:(1)private方法不能被覆蓋,因?yàn)閜rivate方法不允許被繼承。(2)方法名、返回類型、參數(shù)列表必須相同。(3)子類方法的訪問(wèn)修飾符≥父類方法的訪問(wèn)修飾符。(4)子類中的覆蓋方法的修飾符不能是final、static,因?yàn)閒inal修飾的標(biāo)識(shí)符是不可改變的,而覆蓋就是對(duì)父類方法的一種修改,若父類方法不需要修改,只采用繼承就好了。static是一種靜態(tài)行為,而覆蓋則是一種動(dòng)態(tài)行為。(5)子類中的覆蓋方法聲明的拋出異常不能是父類被覆蓋方法聲明的拋出異常的祖先類,只能是其子類或同類。子類中的覆蓋方法也可以不聲明拋出異常,盡管父類中的被覆蓋方法聲明拋出了異常。詳見第5章。成員變量的覆蓋方法可以被覆蓋,成員變量也可以被覆蓋。舉例1classT1{
2publicStrings="T1";
3publicStringgetS(){
4returns;
5}
6}
7classT2extendsT1{
8publicStrings="T2";
9publicStringgetS(){
10returns;
11}
12}
13classTest{
14publicstaticvoidmain(String[]args){
15T1t1=newT1();
16T2t2=newT2();
17
18System.out.println(t1.s);//輸出T1
19System.out.println(t1.getS());//輸出T1
20System.out.println(t2.s);//輸出T2
21System.out.println(t2.getS());//輸出T2
22
23t1=t2;
24System.out.println(t1.s);//輸出T1,而不是T2
25System.out.println(t1.getS());//輸出T2,而不是T1
26}
27}程序分析從上面程序24、25兩行代碼的輸出結(jié)果,可以得出如下結(jié)論:(1)成員變量可以被覆蓋。(2)若直接訪問(wèn)發(fā)生覆蓋的成員變量,則只能訪問(wèn)引用類型的成員變量,上例中第24行,雖然t1指向的對(duì)象是T2類型的,但引用t1的類型是T1,故輸出結(jié)果是T1。(3)若通過(guò)發(fā)生覆蓋的方法來(lái)訪問(wèn)發(fā)生覆蓋的成員變量,則訪問(wèn)的成員變量和方法屬于同一個(gè)對(duì)象,例如第25行,t1指向的對(duì)象是T2類型的,方法getS()是屬于T2實(shí)例對(duì)象的,故訪問(wèn)的變量是T2實(shí)例對(duì)象的。所以,若上例中沒(méi)有第8行代碼,則成員變量s會(huì)被繼承,從而第25行代碼的輸出是T1。若沒(méi)有第9~11行代碼,會(huì)發(fā)生方法的繼承,但方法本身還是類T1的,不是T2的,故第25行代碼的輸出是T1。小結(jié)物理世界與面向?qū)ο箢惻c對(duì)象面向?qū)ο蠡咎卣鞣庋b訪問(wèn)修飾符繼承多態(tài)重載覆蓋作業(yè)習(xí)題3:1,2,3第7講:面向?qū)ο螅?)內(nèi)容提要接口與抽象類引用類型的類型轉(zhuǎn)換其他修飾符類實(shí)例對(duì)象的創(chuàng)建過(guò)程教學(xué)要求重點(diǎn)掌握前三項(xiàng)內(nèi)容,最后一項(xiàng)內(nèi)容要理解。接口在Java中提到接口,有兩種含義:一是Java接口,Java語(yǔ)言中存在的結(jié)構(gòu),和類(class)相似,是一種Java引用類型;二是一個(gè)成員方法,即API。Java接口的定義有兩部分:接口頭和接口體。格式如下:[public|abstract]interface接口名[extends接口列表]{
常量聲明;
方法聲明;
}程序舉例interfaceT{
staticfinalStringS1="abc";
StringS2="def";//S2的修飾符和S1的相同
publicabstractvoidfunc1();
voidfunc2();//func2的修飾符和func1的相同
}接口的繼承與實(shí)現(xiàn)與類相似,接口之間可以有繼承關(guān)系,而與類的單繼承不同的是,接口的繼承允許多重繼承。例如,若已經(jīng)定義了兩個(gè)接口A、B,可以定義C來(lái)繼承A和B。如下:interfaceCextendsA,B{//多個(gè)父接口之間用逗號(hào)分隔
......
}一個(gè)具體的類采用implements關(guān)鍵字來(lái)實(shí)現(xiàn)它,例如:classDimplementsA,B{
......
}實(shí)現(xiàn)類也可以是抽象類,這時(shí)是部分實(shí)現(xiàn)了接口。抽象類類與接口是兩個(gè)極端的情況,前者是所有方法都得到了實(shí)現(xiàn),后者是所有方法都沒(méi)有實(shí)現(xiàn)。在程序設(shè)計(jì)過(guò)程中,有時(shí)還需要一種中間狀態(tài),那就是只需要部分方法實(shí)現(xiàn),其余的是抽象方法,這就是抽象類存在的必要性。當(dāng)然抽象類中的方法可以全部都是抽象的,也可以全部都是實(shí)現(xiàn)的,這是兩種極端的情況。定義一個(gè)抽象類的語(yǔ)法是:[訪問(wèn)修飾符]abstractclass抽象類名{
abstractvoidfunc();
......
}說(shuō)明(1)抽象類必須采用修飾符abstract。(2)含有抽象方法的類必須聲明為抽象類。(3)抽象類不能使用關(guān)鍵字new實(shí)例化,但抽象類可以有構(gòu)造方法。(4)抽象類是一種特殊的類,遵循類的單繼承規(guī)則和(單/多)接口實(shí)現(xiàn)規(guī)則。一個(gè)類可以在繼承一個(gè)父類的同時(shí),實(shí)現(xiàn)一個(gè)或多個(gè)接口,例如:classDextendsCimplementsA,B{
......
}其中A、B是兩個(gè)接口,C是父類。引用類型的類型轉(zhuǎn)換自動(dòng)類型轉(zhuǎn)換在具有繼承關(guān)系的類與類之間,或者接口與接口之間,或者具有實(shí)現(xiàn)關(guān)系的接口和類之間,由下層類型向上層類型轉(zhuǎn)換時(shí),發(fā)生自動(dòng)類型轉(zhuǎn)換。自動(dòng)類型轉(zhuǎn)換也稱為類型自動(dòng)提升。1interfaceI{
2publicvoidfun();
3}
4
5classT1implementsI{
6publicvoidfun(){}
7}
8
9classT2extendsT1{}
10
11classTest{
12publicstaticvoidmain(String[]args){
13Ii=newT1();//合法,發(fā)生自動(dòng)類型轉(zhuǎn)換
14i=newT2();//合法
15T1t1=newT2();//合法
16}
17}強(qiáng)制類型轉(zhuǎn)換在具有繼承關(guān)系的類之間或者具有實(shí)現(xiàn)關(guān)系的接口和類之間,由上層類型向下層類型轉(zhuǎn)換時(shí),發(fā)生強(qiáng)制類型轉(zhuǎn)換,注意其前提是對(duì)象的類型必須是轉(zhuǎn)換目標(biāo)類型本身或者是其子孫類型,即objinstanceofRefType表達(dá)式的值為true時(shí),否則不能轉(zhuǎn)換。例程1interfaceI{
2publicvoidfun();
3}
4classT1{
5publicvoidfun(){}
6}
7classT2extendsT1{}
8classT3extendsT2{}
9
10classKextendsT1{}
11
12classTest{
13publicstaticvoidmain(String[]args){
14T1t1=newT3();
15T2t2=(T2)t1;//合法,發(fā)生強(qiáng)制類型轉(zhuǎn)換
16T3t3=(T3)t2;//合法
17t3=(T3)t1;//合法
18
19t1=newT1();
20t2=(T2)t1;//非法,因?yàn)閠1指向的對(duì)象是T1類型的
21
22t1=newK();
23t2=(T2)t1;//非法,因?yàn)殡m然T2,K都繼承了T1,但t1
24//指向的對(duì)象是K類型的,不是T2類型的
25
26Ka=newK();
27Ib=(I)a;//合法28t1=(T1)b;//合法
29t2=(T2)b;//非法
30Kc=(K)b;//合法
31c=(K)t1;//合法
32}
33}自動(dòng)打包/拆包機(jī)制從JDK1.5中引入了一個(gè)新的機(jī)制,基本類型的自動(dòng)打包和其對(duì)應(yīng)的引用類型的自動(dòng)拆包機(jī)制。在JDK1.5之前,基本類型與其封裝類之間的轉(zhuǎn)換作如下處理(以int類型為例):inti=123;
Integeric=newInteger(i);//把基本類型打包為一個(gè)對(duì)象
i=Value();//把一個(gè)對(duì)象拆包為基本類型而在JDK1.5及以后的版本中,可以如下使用:inti=123;
Integeric=i;//自動(dòng)把i打包成對(duì)象
i=ic;//自動(dòng)把ic拆包為基本類型這是一個(gè)很好的改進(jìn),方便了編程。其他修飾符finalstaticnativetransientstrictfpvolatileassertfinal修飾符final是最終、最后的意思,即不能再發(fā)生變化、終結(jié)了。因此,若final修飾變量(不管是局部變量還是成員變量),則變量一旦被賦值后就不能再改變其值了;若final修飾方法,則該方法就不能再被覆蓋了,因?yàn)橐獎(jiǎng)討B(tài)(即在程序運(yùn)行過(guò)程中)修改方法的功能的辦法就是采用覆蓋;若采用final修飾類,則該類就不能再被繼承,當(dāng)然final類的方法也就不能被覆蓋了,這是因?yàn)閯?dòng)態(tài)修改類的定義的辦法只能是在繼承的基礎(chǔ)上修改,而覆蓋的前提是能夠繼承,現(xiàn)在繼承都不允許了,當(dāng)然其方法也就不能被覆蓋了。staticstatic修飾符可以修飾:①成員屬性;②成員方法;③代碼塊。static不能修飾方法內(nèi)的局部變量(包括方法體內(nèi)的局部變量和形式參數(shù))。native一個(gè)native方法(也稱作本地方法)就是一個(gè)Java程序調(diào)用非Java代碼的接口。native方法的實(shí)現(xiàn)采用非Java語(yǔ)言實(shí)現(xiàn),比如C、Fortran、匯編語(yǔ)言等。這個(gè)特征并非Java所特有,很多其他的編程語(yǔ)言都有
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年醫(yī)學(xué)整形美容服務(wù)協(xié)議
- 2025年員工福利和解合同
- 2025年在線教育運(yùn)營(yíng)合同
- 2025年公司融資投資人增資協(xié)議
- 2025年代理合作簽約協(xié)議
- 二零二五年度嬰幼兒奶粉產(chǎn)品追溯系統(tǒng)建設(shè)合作協(xié)議3篇
- 2025年項(xiàng)目建議書編制委托人工智能+大數(shù)據(jù)合同模板2篇
- 2025年度健康養(yǎng)生產(chǎn)品居間營(yíng)銷合同模板4篇
- 跟著2025年新番走:《動(dòng)漫欣賞》課件帶你領(lǐng)略動(dòng)漫魅力2篇
- 2025年度智能牧場(chǎng)羊代放牧與物聯(lián)網(wǎng)服務(wù)合同
- 反騷擾政策程序
- 運(yùn)動(dòng)技能學(xué)習(xí)與控制課件第十一章運(yùn)動(dòng)技能的練習(xí)
- 射頻在疼痛治療中的應(yīng)用
- 四年級(jí)數(shù)學(xué)豎式計(jì)算100道文檔
- “新零售”模式下生鮮電商的營(yíng)銷策略研究-以盒馬鮮生為例
- 項(xiàng)痹病辨證施護(hù)
- 職業(yè)安全健康工作總結(jié)(2篇)
- 懷化市數(shù)字經(jīng)濟(jì)產(chǎn)業(yè)發(fā)展概況及未來(lái)投資可行性研究報(bào)告
- 07FD02 防空地下室電氣設(shè)備安裝
- 教師高中化學(xué)大單元教學(xué)培訓(xùn)心得體會(huì)
- 彈簧分離問(wèn)題經(jīng)典題目
評(píng)論
0/150
提交評(píng)論