




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Java面向?qū)ο蟪绦蛟O(shè)計(jì)2課程的主要內(nèi)容1、概述2、Java語(yǔ)言基礎(chǔ)3、面向?qū)ο蠹夹g(shù)4、Java實(shí)用類(lèi)庫(kù)5、輸入/輸出處理6、異常處理(Exception)7、多線程8、圖形用戶界面與事件處理9、網(wǎng)絡(luò)通信10、數(shù)據(jù)庫(kù)編程3參考資料Java編程思想Java核心技術(shù),卷I:基礎(chǔ)知識(shí)/java/4本講基本內(nèi)容簡(jiǎn)介各種相關(guān)的編程語(yǔ)言介紹Java語(yǔ)言的特點(diǎn)介紹Java語(yǔ)言的開(kāi)發(fā)環(huán)境Java程序規(guī)范5Java的歷史1991年SunMicrosystem公司的JamesGosling、BillJoe等人開(kāi)發(fā)的面向信息家電的編程軟件OakOak->Java:互聯(lián)網(wǎng)給Java帶來(lái)新的生機(jī)1995年Sun向公眾推出Java并引起業(yè)界的轟動(dòng)Java是當(dāng)今最流行的軟件開(kāi)發(fā)語(yǔ)言之一,Sun推出了Java2&J2EE使Java具有更廣泛的用途,適用于各種應(yīng)用開(kāi)發(fā),尤其是網(wǎng)絡(luò)應(yīng)用,網(wǎng)絡(luò)服務(wù),嵌入式系統(tǒng)6解釋型vs.編譯型的工作模式源程序Java編譯器SPARCpentiumPowerpc中間碼PowerpcpentiumSPARC二進(jìn)制源程序SPARCPowerpcpentiumPowerpcpentiumSPARCJava解釋器類(lèi)、類(lèi)庫(kù)裝載(庫(kù))鏈接7Java的編譯與執(zhí)行編譯,沒(méi)有絕對(duì)地址調(diào)入包含、繼承所用到的所有類(lèi),內(nèi)存分配確定,變成真正可執(zhí)行的機(jī)器碼Java源程序(.java文件)Java編譯器JavaBytecode(.class文件)系統(tǒng)執(zhí)行平臺(tái)Bytecode解釋器Bytecode載入器字節(jié)碼校驗(yàn)器不存在偽造的指針不違反訪問(wèn)權(quán)限不非法訪問(wèn)對(duì)象不導(dǎo)致操作棧溢出
8Java虛擬機(jī)不同的操作系統(tǒng)有不同的虛擬機(jī)。它類(lèi)似一個(gè)小巧而高效的CPU。Bytecode代碼是與平臺(tái)無(wú)關(guān)的虛擬機(jī)的機(jī)器指令。Java字節(jié)代碼運(yùn)行的兩種方式:interpreter(解釋方式)Just-in-time(即時(shí)編譯):由代碼生成器將字節(jié)代碼轉(zhuǎn)換成本機(jī)的機(jī)器代碼,然后可以以較高速度執(zhí)行.JavainterpreterJust-in-timecompilerRuntimeSystemOperatingSystemHardware9Java開(kāi)發(fā)環(huán)境——開(kāi)發(fā)工具javac.exe:Java編譯器,用來(lái)將java程序編譯成Bytecode。java.exe:Java解釋器,執(zhí)行已經(jīng)轉(zhuǎn)換成Bytecode的Java應(yīng)用程序。jdb.exe:Java調(diào)試器,用來(lái)調(diào)試Java程序。javap.exe:反編譯(將.class文件還原為.java)。javadoc.exe:文檔生成器,創(chuàng)建HTML文件。appletviwer.exe:Applet解釋器,用來(lái)解釋已經(jīng)轉(zhuǎn)換成Bytecode的Java小應(yīng)用程序。10Java程序——程序結(jié)構(gòu)Java程序結(jié)構(gòu):package語(yǔ)句:零個(gè)或一個(gè),必須放在文件開(kāi)始import語(yǔ)句:零個(gè)或多個(gè),必須放在所有類(lèi)定義之前publicClassDefinition:零個(gè)或一個(gè)ClassDefinition:零個(gè)或多個(gè)InterfaceDefinition:零個(gè)或多個(gè)類(lèi)個(gè)數(shù):至少一個(gè)類(lèi),最多只能有一個(gè)public類(lèi)源文件命名:若有public類(lèi),源文件必須按該類(lèi)命名標(biāo)識(shí)符:區(qū)分大小寫(xiě)建議:一個(gè)類(lèi)一個(gè).java文件11Java程序——命名規(guī)則包、類(lèi)、變量、方法等命名:要體現(xiàn)各自的含義。包名全部小寫(xiě),io,awt類(lèi)名第一個(gè)字母要大寫(xiě),HelloWorldApp變量名第一個(gè)字母要小寫(xiě),userName方法名第一個(gè)字母要小寫(xiě),setName程序書(shū)寫(xiě)格式:保證良好的可讀性,使程序一目了然。大括號(hào){}的使用與對(duì)齊語(yǔ)句段的對(duì)齊在語(yǔ)句段之間適當(dāng)空行程序注釋:幫助了解程序的功能。類(lèi)注釋 變量注釋 方法注釋語(yǔ)句注釋 語(yǔ)句段注釋13Java語(yǔ)言基礎(chǔ)關(guān)鍵字與標(biāo)識(shí)符數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型的轉(zhuǎn)換運(yùn)算符和表達(dá)式流程控制數(shù)組141.1標(biāo)識(shí)符(Identifier)程序員對(duì)程序中的各個(gè)元素加以命名時(shí)使用的命名記號(hào)稱為標(biāo)識(shí)符,包括:類(lèi)名、變量名、方法名……Java語(yǔ)言中,標(biāo)識(shí)符是以字母,下劃線(_),貨幣符($£¥)開(kāi)始的一個(gè)字符序列,后面可以跟字母,下劃線,貨幣符,數(shù)字。Java標(biāo)識(shí)符區(qū)分大小寫(xiě)字母。標(biāo)識(shí)符中最好不使用貨幣符($£),因?yàn)檫@些符號(hào)常被用于內(nèi)部處理。合法的標(biāo)識(shí)符:IdentifieruserNameUser_Name_sys_value$changemy$Change非法的標(biāo)識(shí)符:2mailroom#class151.2數(shù)據(jù)類(lèi)型(DataType)Javatypesystemprimitivereferencenullcharnumericbooleanclassinterfacearrayintegralfloating-pointbyteshortintlongfloatdouble161.2數(shù)據(jù)類(lèi)型(DataType)數(shù)據(jù)類(lèi)型
所占位數(shù)
數(shù)的范圍
boolean 1 true/falsechar 16 0~65535byte
8
-27~27-1short 16 -215~215-1 int 32 -231~231-1 long 64 -263~263-1 float0.0f 32 7 -3.4e+38
~3.4e+38double0.0 64 15 -1.7e+308
~1.7e+308171.2數(shù)據(jù)類(lèi)型(DataType)所有基本類(lèi)型所占的位數(shù)都是確定的,并不因操作系統(tǒng)的不同而不同。所有基本類(lèi)型的關(guān)鍵詞都是小寫(xiě)的。數(shù)據(jù)類(lèi)型轉(zhuǎn)換必須滿足如下規(guī)則:不能對(duì)boolean類(lèi)型進(jìn)行類(lèi)型轉(zhuǎn)換。不能把對(duì)象類(lèi)型轉(zhuǎn)換成不相關(guān)類(lèi)的對(duì)象。在把容量大的類(lèi)型轉(zhuǎn)換為容量小的類(lèi)型時(shí)必須使用強(qiáng)制類(lèi)型轉(zhuǎn)換。181.2.1布爾類(lèi)型(boolean)布爾型數(shù)據(jù)只有兩個(gè)值true和false它們不對(duì)應(yīng)于任何整數(shù)值false為缺省值布爾型數(shù)據(jù)只能參與邏輯關(guān)系運(yùn)算:&&||==!=!示例:booleanb1;booleanb2=true;b=!b2;booleanb=(b1&&b2)!=false;191.2.2字符類(lèi)型(char)字符型數(shù)據(jù)代表16位的Unicode字符字符常量是用單引號(hào)括起來(lái)的一個(gè)字符'a'‘B’‘\n’‘\u0030’字符型數(shù)據(jù)的取值范圍為0~65535或者說(shuō)\u0000~\uFFFF\u0000為缺省值示例charc1; \\缺省值為0charc2=‘0’; \\賦初值為字符'0'charc3=32; \\用整數(shù)賦初值為空格201.2.2字符類(lèi)型(char)特殊字符的常量表示法:反斜線(Backslash) ‘\\’退格(Backspace) ‘\b’回車(chē)(Carriagereturn) ‘\r’進(jìn)紙符(Formfeed) ‘\f’制表符(Formfeed) ‘\t’換行(Newline) ‘\n’單引號(hào)(Singlequote) ‘\’’八進(jìn)制數(shù)(‘\0’~‘\377’
) ‘\DDD’Unicode字符 ‘\uHHHH’211.2.3整數(shù)類(lèi)型(byteshortintlong)整數(shù)常量表示法:十進(jìn)制:
0-243
2147483647八進(jìn)制以0開(kāi)頭:
010[=8]-0377[=-255]十六進(jìn)制以0x或0X開(kāi)頭:
0x10[=16]-0XF=[-15]64位長(zhǎng)整數(shù)以l或L結(jié)尾:12l-343L0xfffffffffL1L<<32等于4294967296L1<<32等于1(特別注意非0)沒(méi)有以l或L結(jié)尾的數(shù)字,根據(jù)其實(shí)際值所屬范圍,可以被用作byte,short,或int型整數(shù)以l或L結(jié)尾的數(shù)字,無(wú)論其實(shí)際值所屬范圍怎樣,都被用作long型整數(shù)221.2.3整數(shù)類(lèi)型(byteshortintlong)示例byteb1; \\缺省值為0byteb2=127; \\賦初值為127shorts1=(short)(b1+b2);\\強(qiáng)制類(lèi)型轉(zhuǎn)換shorts2=(short)(b1+123)\\強(qiáng)制類(lèi)型轉(zhuǎn)換intn=b1+b2; \\不需要強(qiáng)制類(lèi)型轉(zhuǎn)換longl1=2343; \\不需要強(qiáng)制類(lèi)型轉(zhuǎn)換longl2=4294967296L; \\必須用L或l結(jié)尾longl3=65536*63356; \\乘法運(yùn)算越界,l3為0longl4=65536L*63356; \\l3為4294967296L231.2.4浮點(diǎn)數(shù)類(lèi)型(floatdouble)浮點(diǎn)數(shù)(實(shí)數(shù))常量的兩種表示法十機(jī)制小數(shù)形式:0.23.18-234.科學(xué)計(jì)數(shù)法形式:0.23e61.23E-432位浮點(diǎn)數(shù)形式:0.23f1.23E-4f.18F示例doubled1=127.0; \\賦初值為127doubled2=127; \\賦初值為127floatf1=127.0f; \\必須在數(shù)字后加f或Ffloatf2=4.0e38f; \\錯(cuò)誤!32位浮點(diǎn)數(shù)不能超過(guò) \\3.4028234663852886e38floatf3=(float)d1; \\必須強(qiáng)制類(lèi)型轉(zhuǎn)換241.2.5類(lèi)型轉(zhuǎn)換(typecast)基本數(shù)據(jù)類(lèi)型在賦值時(shí)的自動(dòng)類(lèi)型轉(zhuǎn)換規(guī)則:byte short,char,int,long,float,doubleshort int,long,float,doublechar int,long,float,doubleint long,float,doublelong float,doublefloat double反向的類(lèi)型轉(zhuǎn)換必須使用強(qiáng)制類(lèi)型轉(zhuǎn)換轉(zhuǎn)換過(guò)程中可能損失精度(byte)255==-1 (byte)0x5634==0x34浮點(diǎn)數(shù)到整數(shù)的轉(zhuǎn)換是通過(guò)舍棄小數(shù)得到,而不是四舍五入(int)23.7==23 (int)-45.89f==-45251.3字符串(String)字符串是Java中最常用的類(lèi)字符串常量是雙引號(hào)(“”)引起來(lái)的字符序列“astring”“a\nmultiline\nstring\n”多個(gè)字符串通過(guò)連接運(yùn)算(+)生成新字符串對(duì)象“twostring”+“concatenateintoone”字符串可以和基本類(lèi)型做連接運(yùn)算Strings=“0xF=”+0xF;//“0xF=15”字符串可以和任何對(duì)象做連接運(yùn)算Strings=“s=”+anObject;//“s=…”261.3.1基本類(lèi)型轉(zhuǎn)換為字符串布爾類(lèi)型(boolean)true->“true” false->“false”整數(shù)類(lèi)型(byteshortintlong)byteshortintlong->整數(shù)的十進(jìn)制表示字符類(lèi)型(char)’A’->“A” ‘\uHHHH’->“\uHHHH”浮點(diǎn)數(shù)類(lèi)型(floatdoule)相應(yīng)精度的十進(jìn)制浮點(diǎn)數(shù)(必要時(shí)使用科學(xué)計(jì)數(shù)法)float的精度約為7;double的精度約為15271.3.2對(duì)象轉(zhuǎn)換為字符串任何一個(gè)對(duì)象都有toString()方法,這個(gè)方法在所有對(duì)象的基類(lèi)Object中有缺省實(shí)現(xiàn)在需要將對(duì)象自動(dòng)轉(zhuǎn)換為字符串的地方,對(duì)象的toString()方法被調(diào)用,用來(lái)生成相應(yīng)的字符串。任何類(lèi)(class)、接口(interface)、數(shù)組(array)的實(shí)例都是對(duì)象。281.3.3字符串(String)特殊字符在字符串中的表示法反斜線(Backslash) \\退格(Backspace) \b回車(chē)(Carriagereturn) \r進(jìn)紙符(Formfeed) \f制表符(Formfeed) \t換行(Newline) \n雙引號(hào)(Doublequote) \”八進(jìn)制數(shù)(‘\0’~‘\377’
) \DDDUnicode字符 \uHHHH292.1運(yùn)算符(Operator)算術(shù)運(yùn)算符:+,―,*,/,%,++,--關(guān)系運(yùn)算符:>,<,>=,<=,==,!=布爾邏輯運(yùn)算符:!,&&,||位運(yùn)算符:>>,<<,>>>,&,|,^,~賦值運(yùn)算符:=,+=,-=,*=,/=三元條件運(yùn)算符:?:302.1運(yùn)算符(Operator)其它特殊的運(yùn)算符包括分量運(yùn)算符:.下標(biāo)運(yùn)算符:[]實(shí)例類(lèi)型判斷運(yùn)算符:instanceof對(duì)象示例創(chuàng)建運(yùn)算符:new,強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符:(類(lèi)型)方法調(diào)用運(yùn)算符:()312.2表達(dá)式表達(dá)式是由操作數(shù)和運(yùn)算符按一定的語(yǔ)法形式組成的符號(hào)序列。一個(gè)常量或一個(gè)變量名字是最簡(jiǎn)單的表達(dá)式,其值即該常量或變量的值;表達(dá)式的值還可以用作其他運(yùn)算的操作數(shù),形成更復(fù)雜的表達(dá)式。示例:X num1+num2 a*(b+c)+d3.14 x<=(y+z) x&&y||z322.3優(yōu)先級(jí)和結(jié)合順序1) .,
[],() 9) &2) ++,--,!,~,instanceof 10) ^
3) +,-,(type),
new 11) |4) *
,/,% 12) &&5) +,- 13) ||6) >>,>>>,<< 14) ?:7) >,<,>=,<= 15) =,+=,-=,*=,/=,%=,^=8) ==,!= 16) &=,|=,<<=,>>=,>>>=注:紅色的從右到左,其余的從左到右;用括號(hào)改變結(jié)合順序。 藍(lán)色運(yùn)算符對(duì)byte、short、char作運(yùn)算時(shí),結(jié)果為int型整數(shù)。332.4語(yǔ)句和代碼段一個(gè)由分號(hào)(;)結(jié)尾的單一命令是一條語(yǔ)句(Statement),一條語(yǔ)句一般是一行代碼,但也可以占多行代碼。inta=1;//變量定義及初始化語(yǔ)句用大括號(hào)({……})圍起來(lái)的多條語(yǔ)句構(gòu)成一個(gè)代碼段(Codeblock);同時(shí)代碼段也大括號(hào)前的一些修飾性描述:classAclass{ for(inti=0;i<=1;i++){……
……
} }342.5作用域(Scope)作用域決定了變量可使用的范圍全局變量(Globalvariables):變量可以在整個(gè)類(lèi)中被訪問(wèn);(成員變量,類(lèi)變量)局部變量(Localvariables):變量只能在定義其的代碼段中被訪問(wèn)。作用域規(guī)則:在一個(gè)代碼段中定義的變量只能在該代碼段或者該代碼段的子代碼段中可見(jiàn)。使用局部變量比使用全局變量更安全。352.5作用域(示例)classScoping{intx=0;voidmethod1(){inty;y=x;//OK.method1可以訪問(wèn)y.}voidmethod2(){intz=1;z=y;//Error.y在method2的作用域之外定義
}}363.Java語(yǔ)言的控制分支語(yǔ)句:if-else,switch循環(huán)語(yǔ)句:while,do-while,for與程序轉(zhuǎn)移有關(guān)的其它語(yǔ)句:break,continue,return例外處理語(yǔ)句:try-catch-finally,throw373.1條件語(yǔ)句if-elseif(boolean-expression1){statements1;}elseif(boolean-expression2){statements2;}……elseif(boolean-expressionN){statementsN;}else{statementsElse;}383.1條件語(yǔ)句if-else布爾表達(dá)式boolean-expression是任意一個(gè)返回布爾數(shù)據(jù)類(lèi)型的表達(dá)式,而且必須是(比C或C++要嚴(yán)格)。與C或C++一樣,每個(gè)單一語(yǔ)句后面都要有分號(hào)。為了增強(qiáng)程序的可讀性,應(yīng)將if或else后的語(yǔ)句用{}括起來(lái)。else子句是任選的,不能單獨(dú)作為語(yǔ)句使用,它必須和if語(yǔ)句配對(duì)使用,并且總是與離它最近的if配對(duì)。if(1<2){System.out.println(“1issmallerthan2”);}else{System.out.println(“CanNOTreachhere!”);}393.1多分支語(yǔ)句switchswitch(expression) {casevalue1:statements1;break;……casevalueN:statementsN;break;[default:defaultStatements;]}403.1多分支語(yǔ)句switch表達(dá)式expression的返回值類(lèi)型必須是這幾種類(lèi)型之一:int、byte、char、short、String。case子句中的值valueI必須是常量,而且所有case子句中的值應(yīng)是不同的。default子句是任選的。break語(yǔ)句用來(lái)在執(zhí)行完一個(gè)case分支后,使程序跳出switch語(yǔ)句,即終止switch語(yǔ)句的執(zhí)行。如果某個(gè)case分支后沒(méi)有break語(yǔ)句,程序?qū)⒉辉僮霰容^而執(zhí)行下一個(gè)分支。switch語(yǔ)句的功能可以用if-else語(yǔ)句來(lái)實(shí)現(xiàn),但某些情況下,使用switch語(yǔ)句更簡(jiǎn)煉。413.1多分支語(yǔ)句switchinta=100,b=20,c;charoper=‘+’;switch(oper){case‘+’:c=a+b;break;case‘-’:c=a-b;break;default:c=a*b;
[break;]}423.2循環(huán)語(yǔ)句while[initialization]//初始化條件while(termination){//循環(huán)條件
body; //循環(huán)體
[iteration;] //迭代變更循 //環(huán)條件}當(dāng)表達(dá)式termination為true時(shí),執(zhí)行{}中的語(yǔ)句,否則終止循環(huán)。tbfalsetrue433.2循環(huán)語(yǔ)句do-while[initialization]//初始化條件do{body; //循環(huán)體
[iteration;] //迭代變更循 //環(huán)條件}while(termination);//循環(huán)條件首先執(zhí)行一遍{}中的語(yǔ)句,當(dāng)表達(dá)式termination為true時(shí),繼續(xù)執(zhí)行{}中的語(yǔ)句,否則終止循環(huán)。tbfalsetrue443.2循環(huán)語(yǔ)句forfor(Init;Termination;Iterat){ body;//循環(huán)體}Init//初始化條件Termination//循環(huán)條件Iterat//迭代變更循環(huán)條件tbodyfalsetrueiterainit453.2循環(huán)語(yǔ)句forfor語(yǔ)句執(zhí)行時(shí),首先執(zhí)行初始化操作,然后判斷終止條件是否滿足,如果滿足,則執(zhí)行循環(huán)體中的語(yǔ)句,最后執(zhí)行迭代部分。完成一次循環(huán)后,重新判斷終止條件。初始化、終止以及迭代部分都可以為空語(yǔ)句(但分號(hào)不能省),三者均為空的時(shí)候,相當(dāng)于一個(gè)無(wú)限循環(huán)。在初始化部分和迭代部分可以使用逗號(hào)語(yǔ)句,來(lái)進(jìn)行多個(gè)操作。逗號(hào)語(yǔ)句是用逗號(hào)分隔的語(yǔ)句序列。for(inti=0,intj=10;i<j;i++,j--){……}463.2循環(huán)語(yǔ)句比較intn=1,sum=0;while(n<=10){sum=sum+n;n++;}intn=10,sum=0;do{sum+=n;n--;}while(n>0);intsum=0;for(inti=1;i<=10;i++){sum+=i;}while循環(huán)do-while循環(huán)for循環(huán)473.3程序轉(zhuǎn)移相關(guān)語(yǔ)句break在switch語(yǔ)中,break語(yǔ)句用來(lái)終止switch語(yǔ)句的執(zhí)行,使程序從整個(gè)switch語(yǔ)句后的第一條語(yǔ)句開(kāi)始執(zhí)行。在循環(huán)語(yǔ)句中,break用于終止并跳出循環(huán),從緊跟著循環(huán)體代碼段后的語(yǔ)句執(zhí)行。在Java中,可以為每個(gè)代碼塊加一個(gè)標(biāo)號(hào),break語(yǔ)句可用于跳出它所指定的塊,并從緊跟該塊后的第一條語(yǔ)句處執(zhí)行。BlockLabel:{codeBlock;breakBlockLabel;}483.3程序轉(zhuǎn)移相關(guān)語(yǔ)句breaka:{//標(biāo)記代碼塊a…… b:{//標(biāo)記代碼塊b……c:{//標(biāo)記代碼塊c……breakb;……//這段語(yǔ)句將不執(zhí)行
}//代碼塊c結(jié)束
……//這段語(yǔ)句也不執(zhí)行
}//代碼塊b結(jié)束
……//從這段語(yǔ)句開(kāi)始執(zhí)行}//代碼塊a結(jié)束493.3程序轉(zhuǎn)移相關(guān)語(yǔ)句continuecontinue語(yǔ)句用來(lái)結(jié)束本次循環(huán),跳過(guò)循環(huán)體中下面尚未執(zhí)行的語(yǔ)句,接著進(jìn)行終止條件的判斷,以決定是否繼續(xù)循環(huán)。對(duì)于for語(yǔ)句,在進(jìn)行終止條件的判斷前,還要先執(zhí)行迭代語(yǔ)句。它的格式為:continue;也可以用continue跳轉(zhuǎn)到括號(hào)指明的外層循環(huán)中,這時(shí)的格式為continueouterLable;503.3程序轉(zhuǎn)移相關(guān)語(yǔ)句continueouter:for(inti=0;i<10;i++){//外層循環(huán)
inner:for(intj=0;j<10;j++){//內(nèi)層循環(huán)
if(i<j){ ……
continueouter; } ……}//內(nèi)層循環(huán)結(jié)束
……}//外層循環(huán)結(jié)束for(inti=0;i<10;i++){if(i==5){continue;}
……}513.3程序轉(zhuǎn)移相關(guān)語(yǔ)句returnreturn語(yǔ)句從當(dāng)前方法中退出,返回到調(diào)用該方法的語(yǔ)句處,并從緊跟該語(yǔ)句的下一條語(yǔ)句繼續(xù)程序的執(zhí)行。返回語(yǔ)句有兩種格式:returnexpression;//當(dāng)方法需要返回某種類(lèi)型數(shù)據(jù)時(shí)return;//當(dāng)方法的返回類(lèi)型為void時(shí)單獨(dú)一條return語(yǔ)句放在方法中間時(shí),會(huì)產(chǎn)生編譯錯(cuò)誤,因?yàn)槠浜蟮恼Z(yǔ)句將不會(huì)執(zhí)行到。若真需要退出方法,可以通過(guò)將return語(yǔ)句嵌入某些語(yǔ)句(如if-else)來(lái)使程序在未執(zhí)行完方法中所有語(yǔ)句時(shí)退出。524
數(shù)組和字符串?dāng)?shù)組是一組同類(lèi)型的變量或?qū)ο蟮募蠑?shù)組的類(lèi)型可以是基本類(lèi)型,或類(lèi)和接口數(shù)組中每個(gè)元素的類(lèi)型相同引用數(shù)組元素通過(guò)數(shù)組名[下標(biāo)]數(shù)組下標(biāo)(數(shù)組的索引)從0開(kāi)始數(shù)組是一種特殊的對(duì)象(Object)定義類(lèi)型(聲明)創(chuàng)建數(shù)組(分配內(nèi)存空間):new釋放(Java虛擬機(jī)完成)一維數(shù)組、多維數(shù)組534.1一維數(shù)組一維數(shù)組的元素只有一個(gè)下標(biāo)變量例:A[1],c[3]一維數(shù)組的聲明方法1:類(lèi)型數(shù)組名[];Stringargs[];inta[];doubleamount[];charc[];方法2:類(lèi)型[]數(shù)組名;String[]args;int[]a;double[]amount;char[]c;注意類(lèi)型是數(shù)組中元素的數(shù)據(jù)類(lèi)型(基本和構(gòu)造類(lèi)型)數(shù)組名是一個(gè)標(biāo)識(shí)符數(shù)組聲明后不能被訪問(wèn),因未為數(shù)組元素分配內(nèi)存空間variabledmightnothavebeeninitializedSystem.out.println(d[0]);^1errordouble[]d;System.out.println(d[0]);54數(shù)組的創(chuàng)建用new來(lái)創(chuàng)建數(shù)組為數(shù)組元素分配內(nèi)存空間,并對(duì)數(shù)組元素進(jìn)行初始化格式:數(shù)組名=new類(lèi)型[數(shù)組長(zhǎng)度]例:a=newint[3];聲明和創(chuàng)建的聯(lián)用:int[]a=newint[3];默認(rèn)賦初值整型初值為0int[]i=newint[3];實(shí)型初值為0.0float[]f=newfloat[3];布爾型初值為falseboolean[]b=newboolean[3];字符型初值為\u0000(不可見(jiàn))char[]c=newchar[3];55classTest{ publicstaticvoidmain(Stringargs[]){ int[]i=newint[3]; float[]f=newfloat[3]; boolean[]b=newboolean[3]; char[]c=newchar[3]; for(intj=0;j<i.length;j++) System.out.println(i[j]); for(intj=0;j<f.length;j++) System.out.println(f[j]); for(intj=0;j<b.length;j++) System.out.println(b[j]); for(intj=0;j<c.length;j++) System.out.println(c[j]); }}C:\>javaTest0000.00.00.0falsefalsefalseC:\T56一維數(shù)組的初始化為數(shù)組元素指定初始值方式一:聲明和創(chuàng)建數(shù)組后對(duì)數(shù)組初始化classTest{ publicstaticvoidmain(Stringargs[]){ inta[]=newint[5]; System.out.println(“\t輸出一維數(shù)組a:”); for(inti=0;i<5;i++){ a[i]=i+1; System.out.println(“\ta[”+i+“]=”+a[i]); }}}a.length57一維數(shù)組的初始化方式二:在聲明數(shù)組的同時(shí)對(duì)數(shù)組初始化格式:類(lèi)型數(shù)組名[]={元素1[,元素2……]};inta[]={1,2,3,4,5};classTest{ publicstaticvoidmain(Stringargs[]){ inta[]={1,2,3,4,5}; System.out.println(“\t輸出一維數(shù)組a:”); for(inti=0;i<5;i++) System.out.println(“\ta[”+i+“]=”+a[i]); }}58數(shù)組的賦值數(shù)組的整體賦值用java.lang.System類(lèi)的方法進(jìn)行數(shù)組復(fù)制59數(shù)組整體賦值classTest{ publicstaticvoidmain(Stringargs[]){ inta[]={2,4,6,8}; intb[];int[]c={1,3,5,7}; b=a;c=a; for(intj=0;j<a.length;j++) System.out.print(a[j]+““); System.out.println(); for(intj=0;j<b.length;j++) System.out.print(b[j]+““); System.out.println(); for(intj=0;j<c.length;j++) System.out.print(c[j]); }}C:\>javaTest246824682468C:\>T60一維數(shù)組的數(shù)組復(fù)制java.lang.System類(lèi)的方法publicstaticvoidarraycopy(Objectsrc, intsrcIndex, Objectdest, intdestIndex, intlength)61classTest{publicstaticvoidmain(Stringargs[]){int[]a={2,4,6,8}; int[]b; int[]c={1,3,5,7,9}; b=a; System.arraycopy(a,1,c,0,3); System.out.print(“數(shù)組a:”); for(inti=0;i<a.length;i++) System.out.print(a[i]+“”); System.out.println(); System.out.print(“數(shù)組b:”); for(inti=0;i<b.length;i++) System.out.print(b[i]+“”); System.out.println();一維數(shù)組的數(shù)組復(fù)制System.out.print(“數(shù)組c:”);for(inti=0;i<c.length;i++) System.out.print(c[i]+“”);System.out.println();}}數(shù)組a:2468數(shù)組b:2468數(shù)組c:46879T62小結(jié)類(lèi)型相同、數(shù)量確定的存儲(chǔ)結(jié)構(gòu)用下標(biāo)訪問(wèn)數(shù)組中任一個(gè)元素,數(shù)組名[下標(biāo)]聲明、創(chuàng)建(new)、初始化/賦值int[]d;System.out.println(d[0]);System.out.println(d.length);variabledmightnothavebeeninitializedSystem.out.println(d[0]); ^System.out.println(d.length);^634.2多維數(shù)組數(shù)組的數(shù)組ArraysofArrays例:表格(行和列)以二維數(shù)組為例期中考試期末考試姓名總分6870學(xué)生A698085學(xué)生B847590學(xué)生C8664二維數(shù)組的聲明類(lèi)型數(shù)組名[][],例inta[][];數(shù)組聲明后不能被訪問(wèn),因未為數(shù)組元素分配內(nèi)存空間二維數(shù)組的創(chuàng)建方法一:直接分配空間(new)例inta[][]=newint[2][3];
a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]兩個(gè)一維數(shù)組,每個(gè)數(shù)組包含3個(gè)元素65二維數(shù)組的創(chuàng)建方法二:從最高維開(kāi)始,為每一維分配空間例int[][]c=newint[2][];c[0]=newint[4];c[1]=newint[3];c[0][0]c[0][1]c[0][2]c[0][3]c[1][0]c[1][1]c[1][2]注:為數(shù)組分配空間需指定維數(shù)大小,至少最高維(最左邊)大小錯(cuò)誤:intb[][]=newint[][];66二維數(shù)組的初始化對(duì)每個(gè)元素單獨(dú)進(jìn)行賦值聲明數(shù)組的同時(shí)初始化對(duì)數(shù)組元素的引用數(shù)組名[下標(biāo)1][下標(biāo)2]下標(biāo)為非負(fù)的整型常數(shù)0~67二維數(shù)組的初始化每個(gè)元素單獨(dú)進(jìn)行賦值classTest{ publicstaticvoidmain(Stringargs[]){ int[][]a=newint[3][3]; a[0][0]=1;a[1][1]=1;a[2][2]=1; System.out.println(“數(shù)組a:”); for(inti=0;i<a.length;i++){ for(intj=0;j<a[i].length;j++) System.out.print(a[i][j]+“”); System.out.println(); } }}最高維數(shù)組長(zhǎng)度10001000168二維數(shù)組的初始化聲明數(shù)組的同時(shí)初始化例int[][]a={{1,2,3},{3,4,5}};a[0][0]=1a[0][1]=2a[0][2]=3a[1][0]=3a[1][1]=4a[1][2]=5
例String[][]cartoons={{"Flint","Fred","Wim","Pebbles","Dino"},{"Rub","Barn","Bet","Bam"},{"Jet","Geo","Jane","Elroy","Judy","Rosie","Astro"},{"Sco","Sco","Shag","Velma","Fred","Dap"}};inti=cartoons.length694.3數(shù)組的界限起點(diǎn)和終點(diǎn)數(shù)組的長(zhǎng)度:數(shù)組名.length起點(diǎn):數(shù)組名[0]終點(diǎn):數(shù)組名[length-1]inti={4,56,78,9,34};i.length5i[0]
4i[length-1]=i[4]34i[a]若a>4則???703類(lèi)和對(duì)象-1程序語(yǔ)言的發(fā)展面向機(jī)器(機(jī)器語(yǔ)言、匯編語(yǔ)言)可讀性、可維護(hù)、移植性差;效率高。面向過(guò)程核心:算法+數(shù)據(jù)結(jié)構(gòu)缺陷:隨著應(yīng)用程序的規(guī)模擴(kuò)大,操作與數(shù)據(jù)分離所帶來(lái)的維護(hù)工作量越來(lái)越大不適用于GUI界面、事件驅(qū)動(dòng)編程面向?qū)ο竺嫦驅(qū)ο笤O(shè)計(jì)思想的要點(diǎn)認(rèn)為客觀世界由各種對(duì)象組成,任何事物都是對(duì)象,復(fù)雜的對(duì)象可以由比較簡(jiǎn)單的對(duì)象以某種方式組合而成。把所有對(duì)象都劃分成各種對(duì)象類(lèi),每個(gè)對(duì)象類(lèi)都定義了一組數(shù)據(jù)和一組方法。按照子類(lèi)與父類(lèi)的關(guān)系,把若干個(gè)對(duì)象類(lèi)組成一個(gè)層次結(jié)構(gòu)的系統(tǒng)。對(duì)象彼此之間僅能通過(guò)傳遞消息互相聯(lián)系
抽象性 封裝性 繼承性多態(tài)性面向?qū)ο蟪绦蛟O(shè)計(jì)的優(yōu)點(diǎn)開(kāi)發(fā)時(shí)間短,效率高,可靠性高,所開(kāi)發(fā)的程序更強(qiáng)壯。由于面向?qū)ο缶幊痰目芍赜眯?,可以在?yīng)用程序中大量采用成熟的類(lèi)庫(kù),從而縮短了開(kāi)發(fā)時(shí)間。應(yīng)用程序更易于維護(hù)、更新和升級(jí)。繼承和封裝使得應(yīng)用程序的修改帶來(lái)的影響更加局部化。可重用性 可擴(kuò)展性 可管理性741.面向?qū)ο蟮母拍瞵F(xiàn)實(shí)世界 :人、狗、書(shū)計(jì)算機(jī)模型:類(lèi)是對(duì)象的模板,對(duì)象是類(lèi)的實(shí)例
classPerson{}
Personp=newPerson();intx=9;int[]a=newint[]{1,2,3};Strings=newString(“qaz”);75現(xiàn)實(shí)生活中的對(duì)象對(duì)象在程序中是通過(guò)一種抽象數(shù)據(jù)類(lèi)型來(lái)描述的,這種抽象數(shù)據(jù)類(lèi)型稱為類(lèi)(class)。classCar{intcolorNo;intdoorNumber;
intspeed;
voidbrake(){…}voidspeedUp(){…}voidslowDown(){…}}
抽象數(shù)據(jù)類(lèi)型76……Carcar1;Carcar2;…
…CarcarN;方法構(gòu)造方法是一種特殊方法,它的名字必須與它所在的類(lèi)的名字完全相同,而且沒(méi)有類(lèi)型,構(gòu)造方法也可以重載。方法重載:一個(gè)類(lèi)中可以有多個(gè)方法具有相同的名字,但這些方法的參數(shù)必須不同,即或者是參數(shù)的個(gè)數(shù)不同,或者是某個(gè)參數(shù)的類(lèi)型不同。實(shí)例方法和類(lèi)方法classA{inta;floatmax(floatx,floaty){//實(shí)例方法
…}
staticfloatjerry(){//類(lèi)方法
…}
staticvoidspeak(Strings){//類(lèi)方法
…}}實(shí)例方法既能對(duì)類(lèi)變量操作也能對(duì)實(shí)例變量操作,而類(lèi)方法只能對(duì)類(lèi)變量進(jìn)行操作。實(shí)例方法可以調(diào)用該類(lèi)中的實(shí)例或類(lèi)方法;類(lèi)方法只能調(diào)用該類(lèi)的類(lèi)方法,不能調(diào)用實(shí)例方法。靜態(tài)的是屬于類(lèi)的,實(shí)例的屬于對(duì)象實(shí)例。成員變量、類(lèi)變量、局部變量對(duì)象的內(nèi)存模型(引用、指針\堆和棧)創(chuàng)建一個(gè)對(duì)象包括對(duì)象的聲明和為對(duì)象分配classPoint{intx,y;Point(inta,intb){x=a;y=b;}}Pointp1=newPoint(5,15);Pointp2=newPoint(8,18);p1=p2;參數(shù)的傳遞this關(guān)鍵字包是Java語(yǔ)言中有效地管理類(lèi)的一個(gè)機(jī)制包名的目的是有效的區(qū)分名字相同的類(lèi),不同Java源文件中兩個(gè)類(lèi)名字相同時(shí),它們可以通過(guò)隸屬不同的包來(lái)相互區(qū)分com.sun.java.Hello.class包和import84訪問(wèn)權(quán)限當(dāng)類(lèi)可以被訪問(wèn)時(shí),對(duì)類(lèi)的成員變量和成員方法而言,其應(yīng)用范圍可以通過(guò)施以一定的訪問(wèn)權(quán)限來(lái)限定。 類(lèi)內(nèi) 包內(nèi) 子類(lèi) 任意 公共的(public) ★ ★ ★ ★ 保護(hù)的(protected)★ ★ ★ 包訪問(wèn)(缺?。?★ ★ 私有的(private) ★基本類(lèi)型的類(lèi)包裝
提供了基本數(shù)據(jù)類(lèi)型相關(guān)的類(lèi),這些類(lèi)在java.lang包中,分別是:Byte、Integer、Short、Long、Float、Double和Character類(lèi).自動(dòng)裝箱就是允許把一個(gè)基本數(shù)據(jù)類(lèi)型的值直接賦值給基本數(shù)據(jù)類(lèi)型相對(duì)應(yīng)的類(lèi)的實(shí)例,例如:
Integernumber=100;或
intm=100;Integernumber=m;上述語(yǔ)句的裝箱過(guò)程是:Integernumber=newInteger(m);自動(dòng)拆箱就是允許把基本數(shù)據(jù)類(lèi)型的類(lèi)的實(shí)例當(dāng)作相應(yīng)的基本數(shù)據(jù)類(lèi)型來(lái)使用,例如:number是一個(gè)Integer對(duì)象,那么允許:
intx=number+number;上述語(yǔ)句的拆箱過(guò)程是:intx=Value()+Value();4.11基本類(lèi)型的類(lèi)包裝
4.11.1Double和Float類(lèi)4.11.2Byte、Short、Integer、Long類(lèi)4.11.3Character類(lèi)4.11.4自動(dòng)裝箱與拆箱自動(dòng)裝箱就是允許把一個(gè)基本數(shù)據(jù)類(lèi)型的值直接賦值給基本數(shù)據(jù)類(lèi)型相對(duì)應(yīng)的類(lèi)的實(shí)例,例如:
Integernumber=100;或
intm=100;Integernumber=m;上述語(yǔ)句的裝箱過(guò)程是:Integernumber=newInteger(m);自動(dòng)拆箱就是允許把基本數(shù)據(jù)類(lèi)型的類(lèi)的實(shí)例當(dāng)作相應(yīng)的基本數(shù)據(jù)類(lèi)型來(lái)使用,例如:number是一個(gè)Integer對(duì)象,那么允許:
intx=number+number;上述語(yǔ)句的拆箱過(guò)程是:intx=Value()+Value();87子類(lèi)子類(lèi)是作為另一個(gè)類(lèi)的擴(kuò)充或修正而定義的一個(gè)類(lèi)。bicycle(superclass)MountainbikesRacingbikesTandembikessubclass88繼承繼承使得子類(lèi)可以利用父類(lèi)中定義的方法和變量,就像它們屬于子類(lèi)本身一樣。classEmployee{Stringname;publicvoidshowInfo(){System.out.println(name);}}
classManagerextendsEmployee{Stringdepartment;publicvoidshowInfo(){System.out.println(name);System.out.println(“Managerof”+department);}}
89方法override和成員變量的隱藏覆蓋使得在子類(lèi)中可以重新定義父類(lèi)中已有的方法,從而是子類(lèi)具有自己的行為。classEmployee{Stringname;publicvoidshowInfo(){System.out.println(name);}}
classManagerextendsEmployee{Stringdepartment;
Stringname;publicvoidshowInfo(){System.out.println(name);System.out.println(“Managerof”+department);}}
90繼承的例子ShapePointCircleCylinder何時(shí)選擇繼承?一個(gè)很好的經(jīng)驗(yàn):“B是一個(gè)A嗎?”如果是則讓B做A的子類(lèi).在更多的時(shí)候,組成關(guān)系比繼承更能使系統(tǒng)具有高度的靈活性,可維護(hù)行,并且提高系統(tǒng)的可重用性。ShapePointCircleCylinder91方法覆蓋時(shí)應(yīng)遵循的原則:覆蓋后的方法不能比被覆蓋的方法有更嚴(yán)格的訪問(wèn)前提條件。覆蓋后的方法不能比被覆蓋的方法產(chǎn)生更多的例外,也不能有更松的事后條件。super1、子類(lèi)如果想明確使用父類(lèi)的構(gòu)造方法,必須在子類(lèi)的構(gòu)造方法中使用關(guān)鍵字super來(lái)調(diào)用父類(lèi)的構(gòu)造方法,而且super必須是子類(lèi)構(gòu)造方法中的頭一條語(yǔ)句。3、在父類(lèi)中定義構(gòu)造方法時(shí),應(yīng)盡量寫(xiě)一個(gè)不帶參數(shù)的構(gòu)造方法,以防子類(lèi)省略super時(shí)出現(xiàn)錯(cuò)誤。2、在子類(lèi)的構(gòu)造方法中,沒(méi)有明顯地寫(xiě)出super關(guān)鍵字來(lái)調(diào)用父類(lèi)的某個(gè)構(gòu)造方法,那么默認(rèn)地有:super();即調(diào)用父類(lèi)的不帶參數(shù)的構(gòu)造方法。2、final類(lèi)不能被繼承,即不能有子類(lèi)。1、final關(guān)鍵字可以修飾類(lèi)、成員變量和方法中的局部變量。3、修飾方法,則不允許子類(lèi)重寫(xiě)父類(lèi)的final方法。4、成員變量或局部變量被修飾為final的,就是常量。常量在聲明時(shí)沒(méi)有默認(rèn)值,所以在聲明常量時(shí)必須指定該常量的值,而且不能再發(fā)生變化。final對(duì)象的上轉(zhuǎn)型1.上轉(zhuǎn)型對(duì)象不能操作子類(lèi)新增的成員變量(失掉了這部分屬性);不能調(diào)用子類(lèi)新增的方法(失掉了一些功能)。2.上轉(zhuǎn)型對(duì)象可以訪問(wèn)子類(lèi)繼承或隱藏的成員變量,也可以調(diào)用子類(lèi)繼承的方法或子類(lèi)的重寫(xiě)方法。上轉(zhuǎn)型對(duì)象操作子類(lèi)繼承的方法或子類(lèi)重寫(xiě)的方法,其作用等價(jià)于子類(lèi)對(duì)象去調(diào)用這些方法。因此,如果子類(lèi)重寫(xiě)了父類(lèi)的某個(gè)方法后,當(dāng)對(duì)象的上轉(zhuǎn)型對(duì)象調(diào)用這個(gè)方法時(shí)一定是調(diào)用了子類(lèi)重寫(xiě)的方法。多態(tài)多態(tài):不同的對(duì)象收到同一個(gè)消息可產(chǎn)生完全不同的效果
或同一個(gè)行為具有多個(gè)不同表現(xiàn)形式或形態(tài)的能力多態(tài)的效果:用戶發(fā)送一個(gè)通用的消息,而實(shí)現(xiàn)的細(xì)節(jié)則由接收對(duì)象自行決定。多態(tài)的作用:增強(qiáng)了操作的透明性、可理解性和可擴(kuò)展性。增強(qiáng)了軟件的靈活性和重用性。多態(tài)存在的三個(gè)必要條件繼承重寫(xiě)父類(lèi)引用指向子類(lèi)對(duì)象9596抽象類(lèi)抽象類(lèi):用abstract關(guān)鍵字來(lái)修飾一個(gè)類(lèi)時(shí),該類(lèi)叫做抽象類(lèi);抽象類(lèi)必須被繼承。抽象類(lèi)不能被直接實(shí)例化。它只能作為其它類(lèi)的超類(lèi),這一點(diǎn)與最終類(lèi)(final類(lèi))正好相反。抽象方法:用abstract來(lái)修飾一個(gè)方法時(shí),該方法叫做抽象方法。抽象方法必須被重寫(xiě)抽象方法只有聲明,不能有實(shí)現(xiàn)。定義了抽象方法的類(lèi)必須是抽象類(lèi)。abstract類(lèi)的理解
1、抽象類(lèi)可以抽象出重要的行為標(biāo)準(zhǔn),該行為標(biāo)準(zhǔn)用抽象方法來(lái)表示。即抽象類(lèi)封裝了子類(lèi)必需要有的行為標(biāo)準(zhǔn)。2、抽象類(lèi)聲明的對(duì)象可以成為其子類(lèi)的對(duì)象的上轉(zhuǎn)型對(duì)象,調(diào)用子類(lèi)重寫(xiě)的方法,即體現(xiàn)子類(lèi)根據(jù)抽象類(lèi)里的行為標(biāo)準(zhǔn)給出的具體行為。3、多態(tài)核心技術(shù)之一是使用上轉(zhuǎn)型對(duì)象,即將abstract類(lèi)聲明對(duì)象作為其子類(lèi)的上轉(zhuǎn)型對(duì)象,那么這個(gè)上轉(zhuǎn)型對(duì)象就可以調(diào)用子類(lèi)重寫(xiě)的方法。4、利用多態(tài)設(shè)計(jì)程序的好處是,可以體現(xiàn)程序設(shè)計(jì)的所謂開(kāi)-閉原則。開(kāi)-閉原則強(qiáng)調(diào)一個(gè)程序應(yīng)當(dāng)對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉,增強(qiáng)代碼的可維護(hù)性。98接口(interface)JDK8版本之前,接口體中只有抽象方法.所有的static常量的訪問(wèn)權(quán)限一定都是public(允許省略public、final和static修飾符,接口中不會(huì)有變量)interfacePrintable{
publicstaticfinalintMAX=100;//等價(jià)寫(xiě)法:intMAX=100;
publicabstractvoidadd();
//等價(jià)寫(xiě)法:voidadd();}publicinterfacePrintable{publicstaticfinalintMAX=100;//等價(jià)寫(xiě)法:intMAX=100;publicabstractvoidon();//等價(jià)寫(xiě)法:voidon();publicdefaultintmax(inta,intb){//default方法returna>b?a:b;}
publicstaticvoidf(){System.out.println("注意是從JavaSE8開(kāi)始的");}}classAimplementsPrintable,Addable{}一個(gè)類(lèi)實(shí)現(xiàn)了某個(gè)接口,那么這個(gè)類(lèi)就自然擁有了接口中的常量,default方法(去掉了default關(guān)鍵字),該類(lèi)也可以重寫(xiě)接口中的default方法(注意,重寫(xiě)時(shí)需要去掉default關(guān)鍵字)。如果一個(gè)非abstract類(lèi)實(shí)現(xiàn)了某個(gè)接口,那么這個(gè)類(lèi)必須重寫(xiě)該接口的所有abstract方法,即去掉abstract修飾給出方法體。特別注意的是,類(lèi)實(shí)現(xiàn)某接口,但類(lèi)不擁有接口的static方法。接口中的方法的訪問(wèn)權(quán)限都是public的,重寫(xiě)時(shí)不可省略public(否則就降低了訪問(wèn)權(quán)限,這是不允許的)。接口回調(diào)可以把實(shí)現(xiàn)某一接口的類(lèi)創(chuàng)建的對(duì)象的引用賦給該接口聲明的接口變量中,那么該接口變量就可以調(diào)用被類(lèi)重寫(xiě)的接口方法以及接口中的default方法接口回調(diào)即上轉(zhuǎn)型對(duì)象調(diào)用子類(lèi)的重寫(xiě)方法,即當(dāng)接口變量調(diào)用被類(lèi)重寫(xiě)的接口方法或接口中的default方法時(shí),就是通知相應(yīng)的對(duì)象調(diào)用這個(gè)方法。接口回調(diào)可以把實(shí)現(xiàn)某一接口的類(lèi)創(chuàng)建的對(duì)象的引用賦給該接口聲明的接口變量中,那么該接口變量就可以調(diào)用被類(lèi)重寫(xiě)的接口方法以及接口中的default方法接口回調(diào)即上轉(zhuǎn)型對(duì)象調(diào)用子類(lèi)的重寫(xiě)方法,即當(dāng)接口變量調(diào)用被類(lèi)重寫(xiě)的接口方法或接口中的default方法時(shí),就是通知相應(yīng)的對(duì)象調(diào)用這個(gè)方法。
Lambda表達(dá)式Lambda表達(dá)式主要目的是在使用單接口(只含有一個(gè)方法的接口)匿名類(lèi)時(shí)讓代碼更加簡(jiǎn)潔。Lambda表達(dá)式就是一個(gè)匿名方法(函數(shù)).Class類(lèi)得到一個(gè)類(lèi)的實(shí)例的最常用的方式就是使用new運(yùn)算符和類(lèi)的構(gòu)造方法。但是,Java通過(guò)使用Class也可以得到一個(gè)類(lèi)的實(shí)例。為了使用Class得到一個(gè)類(lèi)的實(shí)例,可以先得到一個(gè)和該類(lèi)相關(guān)的Class對(duì)象(相當(dāng)于得到類(lèi)型)。
異常(Exception)處理105本講內(nèi)容異常機(jī)制簡(jiǎn)介try代碼段拋出異常(throw語(yǔ)句)捕獲異常(catch代碼段)再拋異常(throw)finally代碼段throws語(yǔ)句JDK中的異常自己定義的異常1061.異常機(jī)制簡(jiǎn)介在進(jìn)行程序設(shè)計(jì)時(shí),錯(cuò)誤的產(chǎn)生是不可避免的,如何處理錯(cuò)誤?把錯(cuò)誤交給誰(shuí)去處理?程序又該如何從錯(cuò)誤中恢復(fù)?這是任何程序設(shè)計(jì)語(yǔ)言都要解決的問(wèn)題。所謂錯(cuò)誤,是在程序運(yùn)行過(guò)程中發(fā)生的異常事件,比如除0溢出、數(shù)組越界、文件找不到等,這些事件的發(fā)生將阻礙程序的正常運(yùn)行。為了增加程序的強(qiáng)壯性,程序設(shè)計(jì)時(shí),必須考慮到可能發(fā)生的異常情況并做出相應(yīng)的處理。1071.異常機(jī)制簡(jiǎn)介普通的錯(cuò)誤處理方法通過(guò)被調(diào)用函數(shù)的返回值感知在被調(diào)用函數(shù)中產(chǎn)生的錯(cuò)誤;通過(guò)使用if語(yǔ)句來(lái)判斷是否出現(xiàn)了錯(cuò)誤并進(jìn)行處理。這種錯(cuò)誤處理機(jī)制會(huì)導(dǎo)致不少問(wèn)題函數(shù)的返回值一般有程序意義,需要定義用于錯(cuò)誤處理的無(wú)效的返回值;為知道錯(cuò)誤產(chǎn)生的內(nèi)部細(xì)節(jié),常用全局變量(如Errno)來(lái)存儲(chǔ)錯(cuò)誤的類(lèi)型,這容易導(dǎo)致誤用,因?yàn)樽兞康闹涤锌赡苓€未被處理就被另外的錯(cuò)誤覆蓋掉。108沒(méi)有錯(cuò)誤處理的程序{openTheFile;determineitssize;allocatethatmuchmemory;read-file……closeTheFile;}109以常規(guī)方法處理錯(cuò)誤openFiles;if(theFilesOpen){
determinethelengthofthefile;if(gotTheFileLength){
allocatethatmuchmemory;if(gotEnoughMemory){
readthefileintomemory;if(readFailed)errorCode=-1;}elseerrorCode=-2;}elseerrorCode=-3;}elseerrorCode=-4;……110以常規(guī)方法處理錯(cuò)誤存在的困難和問(wèn)題寫(xiě)程序難大部分精力花在出錯(cuò)處理上了只把能夠想到的錯(cuò)誤考慮到對(duì)以外的情況無(wú)法處理程序可讀性差大量的錯(cuò)誤處理代碼混雜在程序中出錯(cuò)返回的信息量太少無(wú)法更確切的了解錯(cuò)誤狀況或原因111
用異常機(jī)制處理錯(cuò)誤try{openTheFile;determineitssize;allocatethatmuchmemory;read-File;closeTheFile;}catch(fileopenFailed){dosomething;}catch(sizeDetermineFailed){dosomething;}catch(memoryAllocateFailed){dosomething;}catch(readFailed){dosomething;}catch(fileCloseFailed){dosomething;}finally{dosomething;}1122.Java異常機(jī)制try{…}定義可能產(chǎn)生異常的代碼段throwe;用于拋出一個(gè)異常catch(Etypee){…}用于捕獲一個(gè)異常finally{…}用于做統(tǒng)一的事后處理,如釋放資源throwsEtype1,Etype2……用于聲明方法可能拋出的異常類(lèi)型try-catch-finally1133.try代碼段try代碼段包含可能產(chǎn)生異常的代碼try代碼段后跟有一個(gè)或多個(gè)catch代碼段每個(gè)catch代碼段聲明其能處理的一種特定類(lèi)型的異常每個(gè)catch代碼段都是一段異常處理代碼try{
可能產(chǎn)生異常的語(yǔ)句}//不能有其它語(yǔ)句分隔catch(Etypee){
處理異常的語(yǔ)句}……finally{
事后處理語(yǔ)句}1144.拋出異常(throw語(yǔ)句)任何從Throwable派生的類(lèi)都可以用throw語(yǔ)句拋出,拋出異常用來(lái)表明程序遇到的錯(cuò)誤無(wú)法正常執(zhí)行而需要異常處理thrownewMyException(“someinfomation”);異??梢杂蓆ry代碼段中的語(yǔ)句拋出也可以從被try代碼段中調(diào)用的方法中拋出異常還可能產(chǎn)生于數(shù)組下標(biāo)越界以及Java虛擬機(jī)內(nèi)部錯(cuò)誤等Exception和Error是Throwable的直接派生類(lèi)Exception程序應(yīng)該處理的異常情形Error代表系統(tǒng)嚴(yán)重錯(cuò)誤,一般程序不處理這類(lèi)錯(cuò)誤異常拋出點(diǎn)后的代碼在拋出異常后不再執(zhí)行也可以說(shuō)異常的拋出終止了代碼段的執(zhí)行1155.捕獲異常(catch代碼段)catch代碼段聲明其能捕獲的異常類(lèi)型,并包含處理該類(lèi)型異常的代碼異??偸怯删嚯x產(chǎn)生異常最近的匹配catch代碼段處理catch(Exceptione)捕獲所有Exceptioncatch(Throwablet)捕獲Exception和Errortry{
可能產(chǎn)生異常的語(yǔ)句}//不能有其它語(yǔ)句分隔catch(Etypee){
處理異常的語(yǔ)句}……finally{
事后處理語(yǔ)句}1165.捕獲異常(續(xù)1)如果沒(méi)有相應(yīng)的異常處理,則異常被交給上一層try代碼段進(jìn)行處理異常處理的查找依據(jù)類(lèi)型匹配原則順序進(jìn)行第一個(gè)匹配的異常處理被執(zhí)行,當(dāng)異常處理執(zhí)行完畢,程序接著最后一個(gè)catch代碼段后的語(yǔ)句執(zhí)行異常處理的順序影響到異常的處理子類(lèi)異常可被父類(lèi)異常處理捕獲不要先捕獲父類(lèi)異常,再捕獲子類(lèi)異常如果找不到相應(yīng)的異常處理非GUI程序結(jié)束程序執(zhí)行;Applet或GUI程序回復(fù)到事件處理狀態(tài)1176.finally代碼段用于及時(shí)釋放系統(tǒng)資源例如關(guān)閉文件刪除臨時(shí)文件總被執(zhí)行產(chǎn)生異常時(shí),異常處理完畢后執(zhí)行無(wú)異常產(chǎn)生時(shí),try代碼段執(zhí)行完畢后執(zhí)行
break,return,continuetry{
可能產(chǎn)生異常的語(yǔ)句}//不能有其它語(yǔ)句分隔catch(Etypee){
處理異常的語(yǔ)句}……finally{
事后處理語(yǔ)句}1187.throws語(yǔ)句用于方法定義中,表示一個(gè)方法可能拋出的異常publicintread()throwsIOException
1198.異常的分類(lèi)Error:系統(tǒng)的嚴(yán)重錯(cuò)誤,一般由Java虛擬機(jī)監(jiān)測(cè)生成并拋出,它們包括動(dòng)態(tài)鏈接失敗、虛擬機(jī)錯(cuò)誤、線程死鎖等,Java程序?qū)λ鼈円话悴蛔鎏幚怼xception:一般性程序故障,一般由用戶代碼或類(lèi)庫(kù)生成并拋出,Java程序需要對(duì)它們進(jìn)行處理。RuntimeException:運(yùn)行時(shí)程序故障,例如被零除、數(shù)組下標(biāo)越界等。這些錯(cuò)誤可能在任何方法中產(chǎn)生,并且良好的程序應(yīng)該可以避免這些錯(cuò)誤。1209.Throwable類(lèi)的方法Throwable()Throwable(Stringmessage)StringtoString()“classname”:“getMessage()”
StringgetMessage()StringgetLocalizedMessage()voidprintStackTrace()voidprintStackTrace(PrintStream
s)voidprintStackTrace(PrintWriters)ThrowablefillInStackTrace()ThrowableErrorExceptionRuntimeException12177:publicstaticvoidmain(String[]args){78:try{79:testThrowable();80:}81:catch(Throwablet){82:System.err.println(t.toString());83:System.err.println(t.getMessage());84:System.err.println(t.getLocalizedMessage());85:t.printStackTrace();86:}87:}…136:staticvoidtestThrowable()throwsThrowable{137:thrownewThrowable("測(cè)試Throwable的用法。");138:}java.lang.Throwable:測(cè)試Throwable的用法。測(cè)試Throwable的用法。測(cè)試Throwable的用法。java.lang.Throwable:測(cè)試Throwable
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 科學(xué)研究用房屋行業(yè)跨境出海戰(zhàn)略研究報(bào)告
- 軌道燈行業(yè)直播電商戰(zhàn)略研究報(bào)告
- 預(yù)應(yīng)力混凝土方樁行業(yè)跨境出海戰(zhàn)略研究報(bào)告
- 貴金屬礦產(chǎn)行業(yè)跨境出海戰(zhàn)略研究報(bào)告
- 出國(guó)勞務(wù)正式合同樣本
- 代辦貸款寫(xiě)合同標(biāo)準(zhǔn)文本
- 出租改造油漆合同樣本
- 人才提供服務(wù)合同標(biāo)準(zhǔn)文本
- 2025-2030中國(guó)汽車(chē)鋼管行業(yè)發(fā)展分析及投資風(fēng)險(xiǎn)預(yù)測(cè)研究報(bào)告
- 2025-2030中國(guó)汽車(chē)漆密封膠行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 工作交接表表格模板
- 【電氣專業(yè)】15D501建筑物防雷設(shè)施安裝
- 費(fèi)用報(bào)銷(xiāo)單Excel模板
- 普通話水平測(cè)試報(bào)告
- 小學(xué)數(shù)學(xué) 青島版 二年級(jí)上冊(cè)《有序數(shù)圖形》部?jī)?yōu)課件
- EGS002:EG8010+IR2110m正弦波逆變器AD16電路圖印制板圖
- 垃圾處理廠概預(yù)算
- 過(guò)敏性休克應(yīng)急預(yù)案PPT幻燈片(PPT 14頁(yè))
- 廣東省行政執(zhí)法資格考試題庫(kù)(共80頁(yè))
- 英語(yǔ)科技論文寫(xiě)作ppt課件(PPT 65頁(yè))
- 附件2:度重慶市城市園林綠化苗木指導(dǎo)價(jià)(市園林局部分)
評(píng)論
0/150
提交評(píng)論