




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java程式設計與應用開發第一章快速入門
1.1Java簡介1.1.1發展簡史1.1.2Java的特點1.2Java開發環境的構建
1.2.1Java開發包的安裝1.2.2環境變數設定1.2.3基本DOS命令基本要求Java開發包+純文本編輯器
Java開發包:JDK寫字板、UltraEdit等TextPad、JCreator、JBuiler、VisualAge、Eclipse等1.2.1Java開發包的安裝Step1:從獲取免費的Java開發包安裝程式
Step2:雙擊Java開發包安裝程式,出現安裝介面
Java開發包的安裝-1Step3:隨後,安裝程式會彈出許可證協議閱讀畫面
Java開發包的安裝-2Step4:選擇接受協議條款,然後點擊“下一步”按鈕,出現安裝類型選擇畫面Java開發包的安裝-3Step5:點擊選中自定義,然後點擊“下一步”按鈕,出現下圖所示的自定義安裝內容選擇畫面Java開發包的安裝-4Step6:點擊“下一步”按鈕進入正式安裝。其他版本的開發包安裝過程中除了顯示畫面略有不同,其他方面類似
1.2.2環境變數設定PATH-路徑環境變數,用來指定Java開發包中的一些可執行程式(如java.exe、javac.exe等)所在的位置。
CLASSPATH-類路徑環境變數,參見第四章。PATH設定之一(Win2K/NT/XP)(1)右擊“我的電腦”,在彈出菜單中選擇“屬性”,出現系統屬性對話框,
(2)選擇“高級”屬性頁,在該屬性頁面中有一個“環境變數”按鈕,點擊該按鈕進入環境變數編輯窗口
(3)在系統變數區域找到變數Path,雙擊該行就可以編輯該環境變數的值。在該變數已有的值後追加
“;c:\jdk1.4\bin”(注意:不包括引號,分號不能缺少,c:\jdk1.4是開發包的安裝路徑,如果安裝到其他路徑,需作相應修改),點擊“確定”按鈕進行保存工作。至此,完成了Path環境變數的設定工作。所追加的值是用來指定Java開發包中的一些可執行程式(如編譯、解釋以及調試等可執行的工具程式)所在的位置的。
1.2.3基本DOS命令
如何進入DOS控制臺窗口?這裏以Window200為例,點擊“開始”→“運行”,在彈出的對話框中輸入“CMD”,點擊“確定”,即可進入DOS控制臺窗口。需要注意的,這種方式進入DOS控制臺窗口後,當前目錄為系統缺省目錄,如果你想轉換到其他盤符,例如D:,可以在提示符後輸入“D:”,然後回車就轉換到D:盤了。
DOS命令簡介DIR[功能]顯示目錄中的檔以及子目錄。CLS
[功能]清除螢幕DEL
[功能]刪除一個或是多個檔。MD[功能]創建目錄。COPY[功能]檔複製,將一份或多份檔複製到另一個位置。HELP[功能]幫助EXIT[功能]退出DOS窗口。1.3Java應用程式
(1)編寫源代碼
代碼輸入完畢後,將其保存成一個檔,取名為HelloWorld.java。並存放到一個指定的目錄中去
(如F:\Chapter01\code)。
觀察可以發現目錄F:\Chapter01\code中有一個檔,名字為HelloWorld.java,這就是我們剛才保存的源代碼檔
編寫源代碼注意事項由於Java編譯器和解釋器對於代碼中的字元是大小寫敏感的,所以您在按照本書內容輸入代碼、命令以及檔案名時,注意大小寫是否正確。該檔案名必須是HelloWorld(和公開類的類名相同,並且大小寫也要一樣,這是由Java編譯器和解釋器是大小寫敏感而決定的),並且擴展名一定是.java。1.3.2編譯源代碼
在命令提示行輸入以下命令並回車:
javacHelloWorld.java觀察如果螢幕上沒有出現錯誤提示,則表示已經正常完成了編譯工作。再次使用DIR命令,可以發現目錄下多了一個檔HelloWorld.class,即編譯好的中間位元組代碼(bytecode)檔
1.3.3運行程式
在命令提示行輸入:
javaHelloWorld1.3.4常見問題解答
Windows系統對於DOS命令中字元的大小寫是不敏感的。例如:輸入DIR、dir或是Dir得到的結果是相同的。Java編譯器和解釋器對於代碼中的字元是大小寫敏感的。所以在輸入代碼時要特別注意字元的大小寫,例如HelloWorld和helloWorld是不同的,同樣public和Public也是不同的。
常見問題-續1保存源代碼為檔時,要注意檔的命名。檔案名一定要和源代碼中公開類的類名一致(包括大小寫),並且檔擴展名必須為.java。注意,如果將例1.3.1中的publicclassHelloWorld改為classHelloWorld(即HelloWorld不再是公開類),則可以將其保存為任何一個合法的、並以.java為擴展名的檔,例如NotHelloWorld.java。
常見問題-續2如果在進行編譯時報類似如下錯誤(如果讀者使用的是英文版的操作系統,錯誤資訊將是英文):
'javac'不是內部或外部命令,也不是可運行的程式或批處理檔。
則表示系統不能正確定位編譯器javac.exe,原因是未能正確設定PATH環境變數。請參考1.2.2小節關於環境變數的設置。
常見問題-續3編譯時,需要用檔的全名,例如javacHelloWorld.java;解釋運行時只需要用類名,而不需要帶上.class,例如javaHelloWorld。如果輸入:
javaHelloWorld.class
那麼系統報如下錯誤:
Exceptioninthread"main"java.lang.NoClassDefFoundError:HelloWorld/class
1.3.5理解例子
Java代碼中具有三種類型的注釋:
(1)單行注釋
//comments
從//至該行結束的內容是注釋部分,編譯器予以忽略。
(2)多行注釋
/*comments*/
在/*和*/之間的所有內容均為注釋部分,位於/*和*/之間的內容可以是一行或是多行。(3)文檔注釋
/**commentsline1*commentsline2*...*commentslinen*/類定義&main方法publicclassHelloWorld{...}
publicstaticvoidmain(String[]args){...}命令行參數&輸出語句publicstaticvoidmain(String[]args)System.out.println(Strings)1.4JavaAppletApplet稱為小應用程式,和應用程式不同的是,Applet一般是在支持Java的Web流覽器中運行。使用特定的HTML標籤(tag)將Applet嵌入在HTML頁面中,並且Applet程式和頁面均存放在伺服器上,當遠程用戶通過流覽器來訪問頁面時,頁面中所嵌入的Applet程式通過網路被下載到流覽器中並加以運行
1.4.1編寫Applet源代碼importjavax.swing.JApplet;//引入JApplet類importjavax.swing.JLabel;//引入標籤類JLabelpublicclassHelloWorldAppletextendsJApplet{publicvoidinit(){System.out.println("initApplet");}publicvoidstart(){System.out.println("startApplet"); getContentPane().add(newJLabel("HelloWorldApplet"));}publicvoidstop(){System.out.println("stopApplet"); }publicvoiddestroy(){System.out.println("destoryApplet"); }}四個方法init()
-打開嵌有Applet的HTML頁面時,該方法被調用以進行必要的初始化工作。start()
-該方法在init方法結束後被調用,用以啟動Applet。stop()
-關閉嵌有Applet的HTML頁面時,該方法自動調用,以關閉Applet。destroy()
-
stop方法執行完畢後,該方法被調用,用以釋放Applet所使用的資源。
1.4.2編寫嵌入Applet的HTML檔
例1.4.2HelloWorldApplet.html<html><title>ASimpleAppletExample</title><body>Thisisasimpleapplet.<p><appletcode="HelloWorldApplet.class“width="150"height="150"></applet></body></html>1.4.3運行Applet運行應用程式使用的是java解釋器。而運行小應用程式則使用Applet查看器或是WEB流覽器。使用appletviewer
在DOS命令行輸入如下命令並回車:
appletviewerHelloWorldApplet.html2.1基本數據類型
2.1.1識別字和保留字1、識別字
程式員對程式中的各個元素加以命名時使用的命名記號稱為識別字(identifier)。
識別字可由順序任意的大小寫字母,數字,下劃線(_),美元符($)組成。但識別字不能以數字開頭,不能是Java中的保留關鍵字。
例:userName,User_Name,_sys_val,$num為合法的識別字;
2mailroom#,classhello-world為非法的識別字
2、保留字具有專門的意義和用途,不能當作一般的識別字使用,這些識別字稱為保留字(reservedword),也稱為關鍵字。Java語言中的保留字均用小寫字母表示。
2.1.2數據類型概述1.Java中的數據類型劃分簡單數據類型包括:整數類型:byte,short,int,long浮點類型:float,double字元類型:char布爾類型:boolean複合數據類型包括:classinterface數組2、常量和變數常量:用保留字final來實現如:finalintIP=3;變數:intcount;charc=’a';2.1.3簡單數據類型1.布爾類型—boolean
布爾型數據只有兩個值true和false.
例如:booleanb=true;2.字元類型--char字元常量:字元常量是用單引號括起來的一個字元,如'a','A';字元型變數:類型為char,它在機器中占16位,其範圍為0~65535。字元型變數的定義如:charc='a';/*指定變數c為char型,且賦初值為'a'*/3、整型數據整型常量:
十進位整數。如123,-456,0八進制整數。以0開頭,如0123表示十進位數83,-011表示十進位數-9。十六進制整數。以0x或0X開頭,如0x123表示十進位數291,-0X12表示十進位數-18。整型變數:數據類型所占位數數的範圍byte8-27~27-1short16-215~215-1
int32-231~231-1
long64-263~263-14.浮點型(實型)數據實型常量:十進位數形式。由數字和小數點組成,且必須有小數點。如0.123,1.23,123.0
科學計數法形式。如:123e3或123E3,其中e或E之前必須有數字,且e或E後面的指數必須為整數。
float型的值,必須在數字後加f或F。如1.23f。
實型變數:
5.簡單數據類型的例子:
publicclassAssign{publicstaticvoidmain(Stringargs[]){
數據類型所占位數數的範圍floatdouble32643.4e-038~3.4e+038
1.7e-038~1.7e+038
intx,y;//定義x,y兩個整型變數floatz=1.234f;//指定變數z為float型,且賦初值為1.234doublew=1.234;//指定變數w為double型,且賦初值為1.234booleanflag=true;//指定變數flag為boolean型,且賦初值為truecharc;//定義字元型變數c
Stringstr;//定義字串變數strStringstr1="Hi";//指定變數str1為String型,且賦初值為Hic='A';//給字元型變數c賦值'A'str="bye";//給字串變數str賦值"bye"x=12;//給整型變數x賦值為12y=300;//給整型變數y賦值為300
}
}2.1.4簡單數據類型中各類型數據間的優先關係和相互轉換1、不同類型數據間的優先關係如下:低--------------------------------------------->高
byte,short,char->int->long->float->double2、自動類型轉換規則整型,實型,字元型數據可以混合運算。運算中,不同類型的數據先轉化為同一類型,然後進行運算,轉換從低級到高級;3、強制類型轉換高級數據要轉換成低級數據,需用到強制類型轉換,如:
inti;byteb=(byte)i;/*把int型變數i強制轉換為byte型*/2.2運算符和運算式
2.2.1運算符參與運算的數據稱為運算元,按運算元的數目來分,可有:一元運算符:++,--,+,-二元運算符:+,-,>三元運算符:?:基本的運算符按功能劃分,有下麵幾類:1、算術運算符:+,―,*,/,%,++,――。例:3+2;a-b;i++;--i;2、關係運算符:>,<,>=,<=,==,!=。例:count>3;I==0;n!=-1;3、布爾邏輯運算符:!,&&,||。例:flag=true;!(flag);flag&&false;
4、位運算符:>>,<<,>>>,&,|,^,~。例:a=10011101;b=00111001;則有如下結果:
a<<3=11101000;a>>3=11110011a>>>3=00010011;a&b=00011001;a|b=10111101;
~a=01100010;a^b=10100100;5、賦值運算符=,及其擴展賦值運算符如+=,―=,*=,/=等。例:i=3;i+=3;//等效於i=i+3;6、條件運算符?:例:result=(sum==0?1:num/sum);7、其他:包括分量運算符·,下標運算符[],實例運算符instanceof,記憶體分配運算符new,強制類型轉換運算符(類型),方法調用運算符()等。例:
System.out.println("helloworld");intarray1[]=newint[4];2.2.2運算式運算式是由運算元和運算符按一定的語法形式組成的符號序列
1、運算式的類型運算式的類型由運算以及參與運算的運算元的類型決定,可以是簡單類型,也可以是複合類型:布爾型運算式:x&&y||z;整型運算式:num1+num2;
2、運算符的優先次序運算式的運算按照運算符的優先順序從高到低進行,同級運算符從左到右進行。
2.3字串
2.3.1字串的表示字串常量字串常量是用雙引號括住的一串字元。如:"HelloWorld!"
String類的構造方法
String(charchars[]);
String(charchars[],intstartIndex,intnumChars);String(byteascii[],inthiByte);String(byteascii[],inthiByte,intstartIndex,intnumChars);String使用示例:Strings=newString();//生成一個空串
用StringBuffer表示字串
StringBuffer();/*分配16個字元的緩衝區*/StringBuffer(intlen);/*分配len個字元的緩衝區*/StringBuffer(Strings);/*除了按照s的大小分配空間外,再分配16個字元的緩衝區*/2.3.2訪問字串1、類String中提供了length()、charAt()、indexOf()、lastIndexOf()、getChars()、getBytes()、toCharArray()等方法。2、類StringBuffer提供了length()、charAt()、getChars()、capacity()等方法。2.3.3修改字串1、String類提供的方法:2、StringBuffer類提供的方法:StringBuffer中對字串的連接操作是對源串本身進行的,操作之後源串的值發生了變化,變成連接後的串。2.3.4其他操作1、字串的比較String中提供的方法:equals()和equalsIgnoreCase()
2、字串的轉化
java.lang.Object中提供了方法toString()把對象轉化為字串。3、字串"+"操作運算符'+'可用來實現字串的連接:
Strings="Heis"+age+"yearsold";
其他類型的數據與字串進行"+"運算時,將自動轉換成字串。具體過程如下:
Strings=newStringBuffer("heis").append(age).append("yearsold").toString();2.4控制語句
2.4.1分支語句分支語句提供了一種控制機制,使得程式的執行可以跳過某些語句不執行,而轉去執行特定的語句。1、條件語句if-elseif(boolean-expression)statement1;[elsestatement2;]
2、多分支語句switchswitch(expression){casevalue1:statement1;break;
casevalue2:statement2;break;
…………
casevalueN:statemendN;break;
[default:defaultStatement;]
}2.4.2迴圈語1、while語句
[initialization]
while(termination){
body;
[iteration;]
}2、do-while語句
[initialization]
do{
body;
[iteration;]
}while(termination);3.for語句
for(initialization;termination;iteration){
body;
}2.4.3跳轉語句
1、break語句
在switch語中,break語句用來終止switch語句的執行。使程式從switch語句後的第一個語句開始執行。在Java中,可以為每個代碼塊加一個括弧,一個代碼塊通常是用大括弧{}括起來的一段代碼。2、continue語句
continue語句用來結束本次迴圈,跳過循環體中下面尚未執行的語句,接著進行終止條件的判斷,以決定是否繼續迴圈。如:continue;
可以用continue跳轉到括弧指明的外層迴圈中。如:continueouterLable;3、返回語句returnreturn語句從當前方法中退出,返回到調用該方法的語句處。return語句通常用在一個方法體的最後,否則會產生編譯錯誤,除非用在if-else語句中
2.5數組
2.5.1一維數組的定義1.一維數組的定義
typearrayName[];類型(type)可以為Java中任意的數據型,包括簡單類型和複合類型。例:intintArray[];DatedateArray[];2、一維數組的初始化靜態初始化
intintArray[]={1,2,3,4};
StringstringArray[]={"abc","How","you"};動態初始化
1)簡單類型的數組
intintArray[];intArray=newint[5];
2)複合類型的數組
StringstringArray[];StringstringArray=newString[3];/*為數組中每個元素開闢引用空間(32位)*/stringArray[0]=newString("How");//為第一個數組元素開闢空間
stringArray[1]=newString("are");//為第二個數組元素開闢空間
stringArray[2]=newString("you");//為第三個數組元素開闢空間3、一維數組元素的引用
數組元素的引用方式為:
arrayName[index]
index為數組下標,它可以為整型常數或運算式,下標從0開始。每個數組都有一個屬性length指明它的長度,例如:intArray.length指明數組intArray的長度。2.5.2多維數組1、二維數組的定義
typearrayName[][];type[][]arrayName;2、二維數組的初始化靜態初始化
intintArray[][]={{1,2},{2,3},{3,4,5}};
動態初始化
inta[][]=newint[2][3];例:inta[][]=newint[2][];
a[0]=newint[3];
a[1]=newint[5];
對二維複合數據類型的數組,必須首先為最高維分配引用空間,然後再順次為低維分配空間。而且,必須為每個數組元素單獨分配空間。3、二維數組元素的引用對二維數組中的每個元素,引用方式為:arrayName[index1][index2]
例如:num[1][0];4、二維數組舉例:
小結
這一章零碎的知識點很多,要求要記憶的東西也很多,需要大家整理自己的知識體系。如果你在此之前學過其他的電腦語言,那你就會感到很輕鬆,其實對於學習者,與其他的電腦語言相比,java基本語法學起來並沒有什麼不同。只是有些規則不要混淆就可以了。課後任務習題:課後習題2.12.22.32.5實驗題目:1、編寫Java程式,實現字串的翻轉。2、分別用whiledo……whilefor迴圈求解
1)、50!2)、1!+2!+3!+......+10!3.1類和對象3.1.1類聲明
class類名[extends父類名][implements介面列表]{類體}3.1.2類體類中含有兩種成員:成員變數,成員方法。成員變數成員變數的聲明方式如下:
[public|protected|private][static]
[final]type變數名;//成員變數其中,
static:靜態變數(類變數);相對於實例變數final:常量
成員方法
方法的實現包括兩部分內容:方法聲明和方法體。
方法聲明中的限定詞的含義:static:類方法,可通過類名直接調用abstract:抽象方法,沒有方法體final:方法不能被重寫方法聲明方法聲明包括方法名、返回類型和外部參數。其中參數的類型可以是簡單數據類型,也可以是複合數據類型。方法體方法體是對方法的實現,它包括局部變數的聲明以及所有合法的Java指令。3.1.3關鍵字this
在一個方法內,如果局部變數和成員變數的名字相同,則局部變數被隱藏,若要訪問成員變數,要在變數名前加上”this.,”,this表示當前對象的引用。3.1.4方法重載方法重載是指多個方法享有相同的名字,但是這些方法的參數必須不同,或者是參數的個數不同,或者是參數類型不同。返回類型不能用來區分重載的方法。3.1.5類的繼承通過繼承實現代碼複用。Java中所有的類都是通過直接或間接地繼承java.lang.Object類得到的。繼承而得到的類稱為子類,被繼承的類稱為父類。子類不能繼承父類中訪問許可權為private的成員變數和方法。子類可以重寫父類的方法,及命名與父類同名的成員變數。但Java不支持多重繼承,即一個類從多個超類派生的能力。類繼承的傳遞性。3.1.6類的初始化過程
當創建一個對象時,對象的各個變數根據其類型被設置為相應的默認初始值,然後調用構造方法,而每次調用構造方法都是要執行三個階段:
1、調用超類的構造方法;
2、由初始化語句對給變數進行初始化;
3、執行構造方法的體。3.1.7原始檔案若原始檔案中不包括public類或者介面,檔案名字可以是任意合法的檔案名。
Javac*.java;Javac主方法所在的類3.2面向對象特性3.2.1封裝java中類的限定詞的作用範圍比較同一個類同一個包不同包的子類
不同包非子類private*default
**protected***public****3.2.2繼承創建子類格式:
classSubClassextendsSuperClass{
…
}3.2.3多態在java語言中,多態性體現在兩個方面:由方法重載實現的靜態多態性(編譯時多態)和方法重寫實現的動態多態性(運行時多態)。
編譯時多態在編譯階段,具體調用哪個被重載的方法,編譯器會根據參數的不同來靜態確定調用相應的方法。運行時多態由於子類繼承了父類所有的屬性(私有的除外),所以子類對象可以作為父類對象使用。程式中凡是使用父類對象的地方,都可以用子類對象來代替。一個對象可以通過引用子類的實例來調用子類的方法3.3關鍵字static的使用
如果在聲明時不用static關鍵字修飾,則聲明為實例變數和實例方法。實例變數和類變數每個對象的實例變數都分配記憶體,通過該對象來訪問這些實例變數,不同的實例變數是不同的。類變數僅在生成第一個對象時分配記憶體,所有實例對象共用同一個類變數,每個實例對象對類變數的改變都會影響到其他的實例對象。類變數可通過類名直接訪問,也可以通過實例對象訪問類變數。實例方法和類方法類方法可以由類名直接調用,也可由實例對象進行調用。類方法中不能使用this或super關鍵字。
實例方法類方法實例變數實例方法類變數類方法可以可以可以可以可以可以不可以不可以實例方法和類方法訪問許可權示意圖3.4關鍵字final的使用
3.4.1final變數
final變數,則為常量,例如修飾成員變數時,定義時同時給出初始值,而修飾局部變數時不做要求。3.4.2final方法
final修飾的方法不能被子類重寫。
finalreturnTypemethodName(paramList){
…
}3.4.3final類
final修飾類,則類不能被繼承
finalclass類名{
…
}4.1介面(interface)介面
介面是抽象類的一種,只包含常量和方法的定義,而沒有變數和方法的實現,且其方法都是抽象方法。它的用處體現在下面幾個方面:
通過介面實現不相關類的相同行為,而無需考慮這些類之間的關係。
通過介面指明多個類需要實現的方法。
通過介面瞭解對象的交互介面,而無需瞭解對象所對應的類。1)介面的定義
介面的定義包括介面聲明和介面體。
介面聲明的格式如下:
[public]interfaceinterfaceName[extendslistOfSuperInterface]{…}
extends子句與類聲明的extends子句基本相同,不同的是一個介面可有多個父介面,用逗號隔開,而一個類只能有一個父類。
介面體包括常量定義和方法定義
常量定義格式為:typeNAME=value;該常量被實現該介面的多個類共用;具有public,final,static的屬性。在介面中只能聲明常量,不可以聲明變數。
方法體定義格式為:(具有public和abstract屬性,不能聲明為protected)
returnTypemethodName([paramlist]);
注意:在介面的實現類中,實現的介面方法必須聲明為public,因為介面中定義的方法為public(默認)。所以其實現必須聲明為public.否則編譯不會通過。補充由於介面中不能有初始化塊和構建器,所以在定義有名常量時必須包含初始化運算式介面中的方法不能被聲明為static,因為類方法不是抽象的。2)介面的實現
在類的聲明中用implements子句來表示一個類使用某個介面,在類體中可以使用介面中定義的常量,而且必須實現介面中定義的所有方法。一個類可以實現多個介面,在implements子句中用逗號分開。3)介面類型的使用
介面作為一種引用類型來使用。任何實現該介面的類的實例都可以存儲在該介面類型的變數中,通過這些變數可以訪問類所實現的介面中的方法。例1、介面定義publicinterfaceA{}也可以用extends去繼承已有的介面publicinterfaceAextendsB//B是已定義了的介面
{}在類中使用介面需要使用關鍵字implements:
publicclassAimplementsB //這裏A為類,B為介面{}
√Java類只允許單一繼承,即一個類只能繼承(extends)一個父類;但一個類可以實現多個介面,Java支持介面的多重繼承。在Java類定義中,可以同時包括extends子句和implements子句,如果存在extends子句,則implements子句應跟隨extends子句後面。
例2介面實現interfaceA{intx=1;voidmethod1();}interfaceBextendsA{intx=2;voidmethod2();}publicclassExampleimplementsB{publicvoidmethod1(){ System.out.println("x="+x); System.out.println("A.x="+A.x); System.out.println("B.x="+B.x); System.out.println("Example.x="+Example.x);}publicvoidmethod2(){}publicstaticvoidmain(String[]args){ Exampled=newExample(); d.method1();}}例3介面作為類型classWorkerimplementsRunnable{publicvoidrun(){ System.out.print("Workerrun!");}}publicclassServer{ publicstaticvoidmain(String[]args){ Runnablew=newWorker(); (newThread(w)).start(); }}介面不應改變修改某個介面,為其添加一個方法,這個簡單的修改可能會造成牽一發而動全身的局面:所有實現這個介面的類都將無法工作,因為現在他們已經不再實現這個介面了。你要麼放棄對這個介面的修改,要麼連同修改所有實現這個介面的所有類。在設計介面的最初,預測出介面的所有功能,這可能是不太現實。如果覺得介面非改不行,可以創建一個新的介面或者擴展這個介面,算是一種折衷的解決方法。其他相關的類可以保持不變,或者重新實現這個新的介面。4.2抽象類什麼是抽象
抽象就是抽出事物的本質特性而暫時不考慮它們的細節。過程抽象和數據抽象是常用的兩種主要抽象手段。如何用面向對象的方法實現抽象
一個抽象數據類型(AbstractDataType,ADT)可以分解成4個部分,如圖4-2所示。語法和語義構成抽象數據類型ADT的說明,讓使用者瞭解這個抽象數據類型的特徵。屬性和方法構成ADT的實現,展示這個ADT是怎樣做成的。當一個類被聲明為abstract時,這個類被稱為是抽象類。所謂抽象類就是沒有具體實例對象的類。針對這個問題,Java專門提供了一種機制,名為“抽象方法”。它屬於一種不完整的方法,只含有一個聲明,沒有方法主體。下麵是抽象方法聲明時採用的語法:abstractvoidX();人類就是一個典型的抽象類。我們知道,類是對象的集合,對象是類的實例化,而人類這個類卻不存在一個僅屬於它的具體對象。
抽象方法作為類方法修飾符,abstract則聲明瞭一種僅有方法頭,而沒有具體的方法體和操作實現的抽象方法。
可見,abstract方法只有方法頭的聲明,而用一個分號來代替方法體的定義:至於方法體的具體實現,那是由當前類的不同子類在它們各自的類定義中完成的。需要特別注意的是,所有的抽象方法,都必須存在於抽象類之中。除了抽象方法,抽象類也可以有具體的數據和方法。例如,Person類存儲人的名字並且用一個具體的方法來返回它。在Java編程語言中抽象方法是非常重要的概念。在介面裏你會大量的用到它。抽象方法只能出現在抽象類中例abstractclassGraphic{publicstaticfinaldoublePI=3.1415926;doublearea(){return0;};abstractvoiddraw();}classPointextendsGraphic{protecteddoublex,y;publicPoint(doublex,doubley){this.x=x;this.y=y;}voiddraw(){ //在此實現畫一個點
System.out.println("Drawapointat("+x+","+y+")");}publicStringtoString(){ return"("+x+","+y+")";}}classLineextendsGraphic{protectedPointp1,p2;publicLine(Pointp1,Pointp2){ this.p1=p1; this.p2=p2;}voiddraw(){ //在此實現畫一條線
System.out.println("Drawalinefrom"+p1+"to"+p2);}}classCircleextendsGraphic{protectedPointo;protecteddoubler;publicCircle(Pointo,doubler){ this.o=o; this.r=r;}doublearea(){ returnPI*r*r;}voiddraw(){ //在此實現畫一個圓
System.out.println("Drawacircleat"+o+"andr="+r);}}publicclassGraphicDemo{publicstaticvoidmain(String[]args){ Graphic[]g=newGraphic[3];g[0]=newPoint(10,10);g[1]=newLine(newPoint(10,10),newPoint(20,30));g[2]=newCircle(newPoint(10,10),4);for(inti=0;i<g.length;i++){ g[i].draw(); System.out.println("Area="+g[i].area());}}}抽象類和介面的比較抽象類在Java語言中體現了一種繼承關係,要想使得繼承關係合理,抽象類和繼承類之間必須存在"是一個(isa)"關係,即抽象類和繼承類在本質上應該是相同的。而對於介面來說,並不要求介面和介面實現者在本質上是一致的,介面實現者只是實現了介面定義的行為而已。Java中一個類只能繼承一個父類,對抽象類來說也不能例外。但是,一個類卻可以實現多個介面。在Java中按照繼承關係,所有的類形成了一個樹型的層次結構,抽象類位於這個層次中的某個位置。而介面卻不曾在這種樹型的層次結構,位於樹型結構中任何位置的任何類都可以實現一個或者多個不相干的介面。在抽象類的定義中,我們可以定義方法,並賦予的默認行為。而在介面的定義中,只能聲明方法,不能為這些方法提供默認行為。抽象類的維護要比介面容易一些,在抽象類中,增加一個方法並賦予的默認行為,並不一定要修改抽象類的繼承類。而介面一旦修改,所有實現該介面的類都被破壞,需要重新修改。7.3包包在JAVA中的作用:檔夾將檔和應用程式組織為組,包將類組織為組包減少了命名衝突帶來的問題,如果所有類放在同一個包中就容易產生命名衝突引入包以後,聲明類前必須聲明類所在的包,格式:
package包1名.包2名…包n名;
例如:packagejava.awt;或:packagejavax.swing.event;
如果一個類訪問另一個包中的類,必須通過包來引用,有兩種引用方法
1)聲明該類前,使用import語句例如:importjava.awt.Button;//Button為被訪問的類,位於包java.awt中
importjava.awt.*;//引入包java.awt中的全部類
2)訪問另一個包中的類時,使用包名例如:java.awt.Buttonb=newjava.awt.Button();Example(自定義包使用)//exampleone//類在同一個包中
publicclassDate2{intyear,month,day;voidsetDate(inty,intm,intd){year=y;month=m;day=d;}voidprint(){System.out.println(year+""+month+""+day);}}classUseDate2{publicstaticvoidmain(Stringargs[]){Date2b=newDate2();b.setDate(2004,9,1);b.print();}}//類在不同包中//Date2.javapackagep1.p2;publicclassDate2{intyear,month,day;publicvoidsetDate(inty,intm,intd){year=y;month=m;day=d;}publicvoidprint(){System.out.println(year+""+month+""+day);}}//UseDate2.javaimportp1.p2.Date2;classUseDate2{publicstaticvoidmain(Stringargs[]){Date2b=newDate2();b.setDate(2004,9,1);b.print();}}Example在DOS窗口下的運行DOS窗口下必須手動建立包一編譯Date2.java1)建立保存p1.p2.Date2的檔夾,例如E:\db0312)設置環境變數:右擊我的電腦選屬性、高級、環境變數,雙擊系統變數中的CLASSPATH,在變數值中加入保存p1.p2.Date2的檔夾,例如;E:\db031(不要忘了環境變數以;隔開)3)E:\db031下建立p1和p2檔夾,將Date2.java保存E:\db031\p1\p2下4)打開DOS窗口,進入Date2所在目錄,即E:\db031\p1\p2。打開DOS窗口的方法:顯示器左下角,點擊開始、程式、附件、命令提示符;進入E:\db031\p1\p2的方法:切換C:\>E:即輸入E:然後回車(如檔保存在C盤,不須切換);進入E\>cd\db031\p1\p25)編譯,E:\db031\p1\p2>javacDate2.java並回車二編譯並運行UseDate2.java1)建立保存UseDate2的檔夾,例如:C:\db0322)保存UseDate2.java,編譯javacUseDate2.java3)3)運行C:\db032下javaq.UseDate2.javaExample
在Jcreator下的運行Jcreator下,系統按原始檔案中的package語句自動建立包1)建立保存p1.p2.Date2的空project,例如E:\db031,保存Date2.java並編譯,可看到p1和p2已經自動生成2)編譯UseDate2.java3)建立保存UseDate2.java的空project,保存UseDate2.java,此時編譯會報錯4)設置環境變數在Jcreator主菜單的project下選擇projectsettings…
選擇requiredlibraries後按new…
選擇classes後按add選addpath,找到p1.p2.Date2所在檔夾(E:\db031)
在Name中給該路徑命名,按OK
此時可看到該路徑名出現在文本框中,選中該路徑名,可看到該路徑已加入到ClassPath中5)編譯UseDate2.java並運行環境變數classpath的配置Classpath的作用當一個類訪問位於其他包中的其他類時,Classpath幫助該類找到其他類,Classpath的值:Classpath就是包含被訪問的類所在的包的檔夾被訪問的類所在的包由被訪問的類的package語句聲明,並且必須建立同名的檔夾這樣,被訪問的類的路徑包括兩部分:Classpath的值和包兩個必須的Classpath值
.(實心句號)表示當前檔夾
(J2sdk)的安裝目錄\lib表示JAVA類庫所在檔夾J2sdk和Jcreator的安裝J2sdk和JcreatorLE都是自由軟體,可免費下載
J2sdk的網址:/j2se/1.4.2/download.html
還可下載Documation及其它資料
JcreatorLE的網址:/download.html
卸載J2sdk和JcreatorLE,方法:我的電腦、添加刪除程式選中JcreatorLE並刪除,選中Java2runtimeenvironment和J2sdk刪除從19下載Jcreator和J2sdk安裝軟體安裝J2sdk,安裝時可以設置安裝路徑,如設為:C:\j2sdk根據安裝路徑設置環境變數path:右擊我的電腦選屬性、高級、環境變數,雙擊系統變數中的path,增加;(J2sdk安裝路徑)\bin例如;C:\j2sdk\bin
path設置後,打開DOS窗口,鍵入java命令並回車,可檢驗設置是否正確設置環境變數classpath:右擊我的電腦選屬性、高級、環境變數,雙擊系統變數中的classpath
增加.;(J2sdk安裝路徑)\lib例如:.;C:\j2sdk\lib
安裝JcreatorLEJ2sdk安裝時環境變數的設置設置path設置classpath習題1.填空題(1)我們可以通過____________,使得處於不同層次,甚至互不相關的類具有相同的行為,然後由每個類分別去實現這些行為。(2)介面聲明的關鍵字是______________。(3)在聲明類的同時,我們可通過關鍵字__________________實現介面。(4)使用類實現介面時,必須__________該介面的所有方法。(5)Java中,我們可通過________來管理類名空間。(6)創建包的關鍵字是:____________。(7)引入包grade的best類,可使用語句:____________________________。
2、操作題
1、通過設計一介面,定義有關算術的屬性。並創建四個應用該介面的類,分別進行加減乘除的運算。5.1異常的概念例外就是在程式的運行過程中所發生的異常事件,它中斷指令的正常執行。Java中提供了一種獨特的處理例外的機制,通過例外來處理程式設計中出現的錯誤。見demo\mod02\NoException.java見demo\mod02\ExceptionDemo1.javademo\mod02\ExceptionDemo2.java異常的處理機制
捕獲例外:
當Java運行時系統得到一個例外對象時,它將會沿著方法的調用棧逐層回溯,尋找處理這一例外的代碼。找到能夠處理這種類型的例外的方法後,運行時系統把當前例外對象交給這個方法進行處理,這一過程稱為捕獲(catch)例外。這是積極的例外處理機制。如果Java運行時系統找不到可以捕獲例外的方法,則運行時系統將終止,相應的Java程式也將退出。
聲明拋棄例外:
如果一個方法並不知道如何處理所出現的例外,則可在方法聲明時,聲明拋棄(throws)例外。這是一種消極的例外處理機制。異常類層次在jdk中,每個包中都定義了例外類,而所有的例外類都直接或間接地繼承於Throwable類。下圖為jdk中例外類的繼承關係。
異常的兩大類Error
動態鏈接失敗,虛擬機錯誤等,通常Java程式不應該捕獲這類例外,也不會拋棄這種例外。
Exception
1)運行時例外:
繼承於RuntimeException的類都屬於運行時例外,例如算術例外(除零錯)、數組下標越界例外等等。由於這些例外產生的位置是未知的,Java編譯器允許程式員在程式中不對它們做出處理。
2)非運行時例外:
除了運行時例外之外的其他由Exception繼承來的例外類都是非運行時的例外,例如FileNotFoundException(檔未找到例外)。Java編譯器要求在程式中必須處理這種例外,捕獲例外或者聲明拋棄例外。throw:用戶自己產生異常異常的處理java語言中有兩種例外處理機制:捕獲例外和聲明拋棄例外捕獲異常捕獲例外是通過try-catch-finally語句實現的。try{
..//常規的代碼....
}catch(ExceptionName1e){
//處理異常......
}catch(ExceptionName2e){
......
}
......
}finally{
//不論發生什麼異常(或者不發生任何異常),都要執行的部分
}
try捕獲例外的第一步是用try{…}選定捕獲例外的範圍,由try所限定的代碼塊中的語句在執行過程中可能會生成例外對象並拋棄。在try{…}這一部分,存放常規的代碼,期望或可能出錯的代碼段catch每個try代碼塊可以伴隨一個或多個catch語句,用於處理try代碼塊中所生成的例外事件。catch語句只需要一個形式參數指明它所能夠捕獲的例外類型,這個類必須是Throwable的子類,運行時系統通過參數值把被拋棄的例外對象傳遞給catch塊。
在catch塊中是對例外對象進行處理的代碼,與訪問其他對象一樣,可以訪問一個例外對象的變數或調用它的方法。getMessage()是類Throwable所提供的方法,用來得到有關異常事件的資訊,類Throwable還提供了方法printStackTrace()用來跟蹤異常事件發生時執行堆疊的內容catchtry{
......}catch(FileNotFoundExceptione){
System.out.println(e);
System.out.println("message:"+e.getMessage());
e.printStackTrace(System.out);}catch(IOExceptione){
System.out.println(e);}
catch語句的順序:
捕獲例外的順序和catch語句的順序有關,當捕獲到一個例外時,剩下的catch語句就不再進行匹配。因此,在安排catch語句的順序時,首先應該捕獲最特殊的例外,然後再逐漸一般化。也就是一般先安排子類,再安排父類。
finally捕獲例外的最後一步是通過finally語句為例外處理提供一個統一的出口,使得在控制流轉到程式的其他部分以前,能夠對程式的狀態作統一的管理。不論在try代碼塊中是否發生了異常事件,finally塊中的語句都會被執行。
finallyfinally在檔處理時非常有用try{
對檔進行處理的程式;}catch(IOExceptione){//對檔異常進行處理;}finally{
不論是否發生異常,都關閉檔;}捕獲異常編寫Java程式,包含三種異常算術異常,字串越界,數組越界觀察輸出資訊:每個異常對象可以直接給出資訊聲明拋出異常
1.聲明拋出異常如果在一個方法中生成了一個例外,但是這一方法並不確切地知道該如何對這一異常事件進行處理,這時,一個方法就應該聲明拋棄例外,使得例外對象可以從調用棧向後傳播,直到有合適的方法捕獲它為止。
聲明拋棄例外是在一個方法聲明中的throws子句中指明的。例如:
publicintread()throwsIOException{
......}
throws子句中同時可以指明多個例外,之間由逗號隔開。例如:
publicstaticvoidmain(Stringargs[])throws
IOException,IndexOutOfBoundsException{…}
Mod02\Exception1.java觀察運行結果聲明拋出異常
2.拋出例外
拋出例外就是產生例外對象的過程,首先要生成例外對象,例外或者由虛擬機生成,或者由某些類的實例生成,也可以在程式中生成。在方法中,拋出例外對象是通過throw語句實現的。
例如:
IOExceptione=newIOException();
throwe;
可以拋出的例外必須是Throwable或其子類的實例。下麵的語句在編譯時將會產生語法錯誤:
thrownewString("wanttothrow");拋出異常.拋棄異常:不是出錯產生,而是人為地拋出throwThrowableObject;thrownewArithmeticException();例:編寫程式人為拋出(JavaThrow.prj)ArithmeticException,ArrayIndexOutOfBoundsExceptionStringIndexOutOfBoundsExceptionMod02\JavaThrow.javaAmethodExceptionAnothermethodthrowcaught注意
自定義例外類必須是Throwable的直接或間接子類。
注意:一個方法所聲明拋棄的例外是作為這個方法與外界交互的一部分而存在的。所以,方法的調用者必須瞭解這些例外,並確定如何正確的處理他們。創建自己的異常不是由Java系統監測到的異常(下標越界,被0-除等),而是由用戶自己定義的異常.用戶定義的異常同樣要用try--catch捕獲,但必須由用戶自己拋出thrownewMyException.異常是一個類,用戶定義的異常必須繼承自Throwable或Exception類,建議用Exception類.創造自己的異常形如:classMyExceptionextendsException{….};例1:計算兩個數之和,當任意一個數超出範圍時,拋出自己的異常publicclassNumberRangeExceptionextendsException{publicNumberRangeException(Stringmsg){super(msg);}}
創建自己的異常
publicbooleanaction(Eventevt,Objectarg){try{intanswer=CalcAnswer();answerStr=String.valueOf(answer);}catch(NumberRangeExceptione){answerStr=e.getMessage();}repaint();returntrue;}
4.6創造自己的異常.publicintCalcAnswer()throwsNumberRangeException{intint1,int2;intanswer=-1;Stringstr1=textField1.getText();Stringstr2=textField2.getText();try{int1=Integer.parseInt(str1);int2=Integer.parseInt(str2);if((int1<10)||(int1>20)||(int2<10)||(int2>20)){NumberRangeExceptione=newNumberRangeException(”Numbersnotwithinthespecifiedrange.");throwe;}answer=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 福建水利电力职业技术学院《室内空气污染监测与治理实验》2023-2024学年第二学期期末试卷
- 山西航空职业技术学院《数学分析》2023-2024学年第一学期期末试卷
- 南京审计大学《科学技术哲学专题》2023-2024学年第一学期期末试卷
- 江苏旅游职业学院《数学》2023-2024学年第二学期期末试卷
- 辽宁科技学院《外国文学经典》2023-2024学年第二学期期末试卷
- 长春工业大学人文信息学院《影视后期与非线性编辑技术》2023-2024学年第二学期期末试卷
- 云南省峨山县大龙潭中学2025届高三下学期“一诊模拟”考试(二)化学试题含解析
- 2025年保安证考试复习资料试题及答案
- 知识梳理保安证试题及答案
- 西安汽车职业大学《园林工程原理》2023-2024学年第一学期期末试卷
- 煤矿“双回路”供电保障专项整治实施方案
- 科学研究方法与学术论文写作
- 航空航天概论(课堂PPT)
- 英语的起源与发展(课堂PPT)
- 药物化学结构式大全(高清版)
- 二房东租房合同范文
- 物业工程人员入户维修流程
- 科教版四年级第二学期自然教学教案
- FABE模压训练
- 第二次全国残疾人抽样调查主要数据手册
- 七年级下册英语单词默写表(直接打印)
评论
0/150
提交评论