共計(jì) 14598 個(gè)字符,預(yù)計(jì)需要花費(fèi) 37 分鐘才能閱讀完成。
這篇文章給大家介紹 Java 程序設(shè)計(jì)基礎(chǔ)是怎樣的,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
3.1Java 編程概況
現(xiàn)在你可以復(fù)習(xí)一下 Java 語言的背景材料,它的基本結(jié)構(gòu)象 C /C++,但任何用面向過程語言編寫過程序的人都可以了解 Java 語言的大部分結(jié)構(gòu).
3.1.1 程序結(jié)構(gòu)
Java 語言的源程序代碼由一個(gè)或多個(gè)編譯單元 (compilationunit) 組成,每個(gè)編譯單元只能包含下列內(nèi)容 (空格和注釋除外):* 一個(gè)程序包語句(packagestatement)* 入口語句(importstatements)* 類的聲明(classdeclarations)* 界面聲明(interfacedeclarations) 每個(gè) Java 的編譯單元可包含多個(gè)類或界面,但是每個(gè)編譯單元最多只能有一個(gè)類或者界面是公共的。Java 的源程序代碼被編譯之后,便產(chǎn)生了 Java 字節(jié)代碼。Java 的字節(jié)代碼由一種不依賴于機(jī)器的指令組成,這種指令能被 Java 的運(yùn)行系統(tǒng) (runtimesystem) 有效地解釋。Java 的運(yùn)行系統(tǒng)工作起來如同一臺虛擬機(jī)。在當(dāng)前的 Java 實(shí)現(xiàn)中,每個(gè)編譯單元就是一個(gè)以.java 為后綴的文件。每個(gè)編譯單元有若干個(gè)類,編譯后,每個(gè)類生成一個(gè).class 文件。.class 文件是 Java 虛擬機(jī)能夠識別的代碼。
3.1.2 注釋
三種類型如下:// 注釋一行 /* 一行或多行注釋 *//** 文檔注釋 **/
文檔注釋一般放在一個(gè)變量或函數(shù)定義之前, 指示在任何自動(dòng)生成文檔系統(tǒng)中調(diào)入。這種注釋都是聲明條目的描述.。
3.1.3 標(biāo)識符
變量,函數(shù),類和對象的名稱都是標(biāo)識符,程序員需要標(biāo)識和使用的東西都需要標(biāo)識符。在 Java 語言里, 標(biāo)識符以字符或_,$ 開頭, 后面可以包含數(shù)字,標(biāo)識符是大小寫有區(qū)別的, 沒有長度限制。
有效的標(biāo)識符 mynameict_networkHello_sys_path$bill
例子:inta_number;char_onechar;float$bill;
關(guān)鍵詞 abstractcontinuefornewswitch
booleandefaultgotonullsynchronized
breakdoifpackagethis
bytedoubleimplementsprivatethreadsafe
byvalueelseimportprotectedthrow
caseextendsinstanceofpublictransient
catchfalseintreturntrue
charfinalinterfaceshorttry
classfinallylongstaticvoid
constfloatnativesuperwhile
其它保留詞以下單詞被保留使用:castfuturegenericinner
operatorouterrestvar
3.1.4 數(shù)據(jù)類型
Java 使用五種基本類型:integer(整數(shù)),floating(浮點(diǎn)數(shù)),point(指針),Boolean(布爾變量),CharacterorString(字符或字符?reg;)。integer 整數(shù)下邊給出的數(shù)據(jù)表示都是整數(shù)的例子:4,15,089,0xAD00
整數(shù)長度數(shù)據(jù)類型表示
8bitsbyte
16bitsshort
32bitsint
64bitslong
floating 浮點(diǎn)數(shù)下邊給出的數(shù)據(jù)表示都是浮點(diǎn)數(shù)的例子:6.37,3.7E15,3e8
浮點(diǎn)數(shù)長度數(shù)據(jù)類型表示
32bitsfloat
64bitsdouble
Boolean 布爾變量下邊是布爾變量的兩種可能取值:truefalse
Character 字符下邊給出的都是字符的例子:a\t(tab)\u????(unicode)
String 字符?reg; 下邊給出的都是字符?reg; 的例子:Thisisastringliteral 中國科學(xué)院計(jì)算所
數(shù)組你可以定義任意類型的數(shù)組.chars[]; 這是字符型數(shù)組;int[]array; 這是整型數(shù)組;你還可以定義數(shù)組的數(shù)組.intblock[][]=newint[2][3]; 數(shù)組邊界在運(yùn)行時(shí)被檢測, 避免堆棧溢出和內(nèi)存崩潰.
在 Java 里, 數(shù)組實(shí)際上是一個(gè)對象, 數(shù)組有一個(gè)成員變量:length。你可以用這個(gè)成員函數(shù)來查看任意數(shù)組的長度.inta[][]=newint[10][3]a.length/*10*/a[0].length/*3*/
創(chuàng)建數(shù)組在 Java 里創(chuàng)建數(shù)組, 你可使用兩種基本方法?reg; 一。創(chuàng)建一個(gè)空數(shù)組:intlist[]=newint[50]; 或你可以用初始數(shù)值填充數(shù)組.Stringnames[]={ Chenji , Yuan , Chun , Yang 相當(dāng)于下面功能:Stringnames[];names=newString[4];names[0]=newString(Chenji names[1]=newString(Yuan names[2]=newString(Chun names[3]=newString(Yang
在編譯時(shí)你不能象下例那樣創(chuàng)建靜態(tài)數(shù)組。intname[50];// 將產(chǎn)生一個(gè)編譯錯(cuò)誤
你也不能用 new 操作去填充一個(gè)沒定義大小的數(shù)組。intname[];for(inti=0;i i++){name[i]=i;}
3.1.5 表達(dá)式
Java 語言的表達(dá)式和 C 語言非常類似。
運(yùn)算符運(yùn)算符 (operator) 優(yōu)先級從高到底排列如下:.[]()++–!~instanceof*/%+- = \==!= ^ ||?:=op=,
整數(shù)運(yùn)算符在整數(shù)運(yùn)算時(shí),如果操作數(shù)是 long 類型,則運(yùn)算結(jié)果是 long 類型,否則為 int 類型,絕不會(huì)是 byte,short 或 char 型。這樣,如果變量 i 被聲明為 short 或 byte,i+ 1 的結(jié)果會(huì)是 int。如果結(jié)果超過該類型的取值范圍,則按該類型的最大值取模。單目整數(shù)運(yùn)算符是:
運(yùn)算符操作 - 單目非~位補(bǔ)碼 ++ 加 1 – 減 1
++ 運(yùn)算符用于表示直接加 1 操作。增量操作也可以用加運(yùn)算符和賦值操作間接完成。++lvalue(左值?copy; 表示 lvalue+=1,++lvalue 也表示 lvalue=lvalue+1(只要 lvalue 沒有副作用)。– 運(yùn)算符用于表示減 1 操作。++ 和 – 運(yùn)算符既可以作為前綴運(yùn)算符,也可以做為后綴運(yùn)算符。雙目整數(shù)運(yùn)算符是:
運(yùn)算符操作 **+ 加 - 減 * 乘 / 除 % 取模 位與|位或 ^ 位異或 左移 右移(帶符號) 添零右移
整數(shù)除法按零舍入。除法和取模遵守以下等式:(a/b)*b+(a%b)== a 整數(shù)算術(shù)運(yùn)算的異常是由于除零或按零取模造成的。它將引發(fā)一個(gè)算術(shù)異常。下溢產(chǎn)生零,上溢導(dǎo)致越界。例如:加 1 超過整數(shù)最大值,取模后,變成最小值。一個(gè) op= 賦值運(yùn)算符,和上表中的各雙目整數(shù)運(yùn)算符聯(lián)用,構(gòu)成一個(gè)表達(dá)式。整數(shù)關(guān)系運(yùn)算符,,=,=,== 和!= 產(chǎn)生 boolean 類型的數(shù)據(jù)。
布爾運(yùn)算符布爾 (boolean) 變量或表達(dá)式的組合運(yùn)算可以產(chǎn)生新的 boolean 值。單目運(yùn)算符! 是布爾非。雙目運(yùn)算符&,|和 ^ 是邏輯 AND,OR 和 XOR 運(yùn)算符,它們強(qiáng)制兩個(gè)操作數(shù)求布爾值。為避免右側(cè)操作數(shù)冗余求值,用戶可以使用短路求值運(yùn)算符&&和||。用戶可以使用 == 和!=,賦值運(yùn)算符也可以用 =、|=、^=。三元條件操作符?: 和 C 語言中的一樣。
浮點(diǎn)運(yùn)算符浮點(diǎn)運(yùn)算符可以使用常規(guī)運(yùn)算符的組合:如單目運(yùn)算符 ++、–,雙目運(yùn)算符 +、-、* 和 /,以及賦值運(yùn)算符 +=,-=,*=,和 /=。此外,還有取模運(yùn)算:% 和 %= 也可以作用于浮點(diǎn)數(shù),例如:a%b 和 a -((int)(a/b)*b)的語義相同。這表示 a%b 的結(jié)果是除完后剩下的浮點(diǎn)數(shù)部分。只有單精度操作數(shù)的浮點(diǎn)表達(dá)式按照單精度運(yùn)算求值,產(chǎn)生單精度結(jié)果。如果浮點(diǎn)表達(dá)式中含有一個(gè)或一個(gè)以上的雙精度操作數(shù),則按雙精度運(yùn)算,結(jié)果是雙精度浮點(diǎn)數(shù)。
數(shù)組運(yùn)算符數(shù)組運(yùn)算符形式如下:expression [expression]可給出數(shù)組中某個(gè)元素的值。合法的取值范圍是從 0 到數(shù)組的長度減 1。取值范圍的檢查只在運(yùn)行時(shí)刻實(shí)?copy;。
?reg; 運(yùn)算符?reg; 以 String 對象實(shí)現(xiàn)。運(yùn)算符 + 完成并?reg; 操作,如果必要?jiǎng)t自動(dòng)把操作數(shù)轉(zhuǎn)換為 String 型。如果操作數(shù)是一個(gè)對象,它可定義一個(gè)方法 toString()返回該對象的 String 方式,例如 floata=1.0print(“Thevalueofais”+a+“\n”);+ 運(yùn)算符用到?reg; 上的例子 Strings=“a=”+a;+= 運(yùn)算符也可以用于 String。注意,左邊 (下例中的 s1) 僅求值一次。s1+=a;//s1=s1+a// 若 a 非 String 型,自動(dòng)轉(zhuǎn)換為 String 型。
對象運(yùn)算符雙目運(yùn)算符 instanceof 測試某個(gè)對象是否是指定類或其子類的實(shí)例。例如:if(myObjectinstanceofMyClass){MyClassanothermyObject=(MyClass)myObject;…}是判定 myObject 是否是 MyClass 的實(shí)例或是其子類的實(shí)例。
強(qiáng)制和轉(zhuǎn)換 Java 語言和解釋器限制使用強(qiáng)制和轉(zhuǎn)換,以防止出錯(cuò)導(dǎo)致系統(tǒng)崩潰。整數(shù)和浮點(diǎn)數(shù)?reg; 間可以來回強(qiáng)制轉(zhuǎn)換,但整數(shù)不能強(qiáng)制轉(zhuǎn)換成數(shù)組或?qū)ο蟆ο蟛荒鼙粡?qiáng)制為基本類型。
3.1.6Java 流控制
下面幾個(gè)控制結(jié)構(gòu)是從 C 語言借鑒的。
分支結(jié)構(gòu)
if/else 分支結(jié)構(gòu)
if(Boolean){statemanets;}else{statements;}
switch 分支結(jié)構(gòu)
switch(expr1){caseexpr2:statements;break;caseexpr3:statements;break;default:statements;break;}
循環(huán)結(jié)構(gòu) for 循環(huán)結(jié)構(gòu)
for(initexpr1;testexpr2;incrementexpr3){statements;}
While 循環(huán)結(jié)構(gòu)
While(Boolean){statements;}
Do 循環(huán)結(jié)構(gòu)
do{statements;}while(Boolean);
一般順序控制
break[label]continue[label]reutrnexpr;label:statement;
for 循環(huán)例子下面是一個(gè)程序例子,畫幾條線,分別用紅, 綠, 藍(lán)顏色,這段程序可能是 Java 函數(shù)的一部分:
intcount;for(count=1;count count++){switch(count%3)}case0:setColor(Color.red);break;case1:setColor(Color.blue);break;case2:setColor(Color.green);break;}g.drawLine(10,count*10,80,count*10);}
3.2Java 變量和函數(shù)的實(shí)例
Java 的類包含變量和函數(shù)。數(shù)據(jù)變量可以是一?copy; 原始的類型, 如 int,char 等。成員函數(shù)是一?copy; 可執(zhí)行的過程。例如, 下面程序里:publicclassClassOne{inti;publicClassOne(){i=10;}
publicvoidAdd_i(intj){i=i+j;}}
ClassOne 包含一個(gè)變量 i 和兩個(gè)成員函數(shù),ClassOne(intfirst)和 Add_i(intj)。
成員函數(shù)成員函數(shù)是一?copy; 可被其它類或自己類調(diào)用的處理子程序。一個(gè)特殊的成員函數(shù)叫構(gòu)造函數(shù), 這個(gè)函數(shù)名稱一般與本類名程相同。它沒有返回值。
構(gòu)造函數(shù)和成員函數(shù)當(dāng)你在 Java 里定義一個(gè)類時(shí), 你可定義一個(gè)或多個(gè)可選的構(gòu)造函數(shù), 當(dāng)創(chuàng)建本類的一個(gè)對象時(shí)用某一個(gè)構(gòu)造函數(shù)來初始化本對象。用前面的程序例子來說明, 當(dāng) ClassOne 類創(chuàng)建一個(gè)新實(shí)例時(shí), 所有成員函數(shù)和變量被創(chuàng)建(創(chuàng)建實(shí)例)。構(gòu)造函數(shù)被調(diào)用。ClassOnemc:mc=newClassOne();
關(guān)鍵詞 new 用來創(chuàng)建一個(gè)類的實(shí)例, 一個(gè)類用 new 初始化?reg; 前并不占用內(nèi)存, 它只是一個(gè)類型定義, 當(dāng) mc 對象初始化后,mc 對象里的 i 變量等于 10。你可以通過對象名來引用變量 i。(有時(shí)稱?reg; 為實(shí)例變量)mc.i++;//mc 實(shí)例變量加 1 因?yàn)?mc 有 ClassOne 類的所有變量和成員函數(shù),我們可以使用同樣的語法來調(diào)用成員函數(shù) Add_i:Add_i(10); 現(xiàn)在 mc.i 變量等于 21.
結(jié)束函數(shù) Java 并不支持析構(gòu)函數(shù)(C++ 里的定義), 因?yàn)?java 本身提?copy; 對象無用時(shí)自動(dòng)清除的功能, 同時(shí)它也提?copy; 了一個(gè)自動(dòng)拉圾箱的成員函數(shù),在清除對象時(shí)被調(diào)用:Protectedvoidfinalize(){close();}
3.3 對象有效范圍和廢物自動(dòng)回收
對象有一定的生命期并在它的生命期間使用資源, 當(dāng)一個(gè)對象不再被使用時(shí), 它應(yīng)釋放內(nèi)存, 避免內(nèi)存溢出。在 Java 里, 收集和釋放內(nèi)存是一個(gè)叫自動(dòng)廢品回收站的線程的責(zé)任。這個(gè)線程監(jiān)視對象有效范圍并給一個(gè)走出有效范圍的對象作上標(biāo)識。
例如:Strings;// 沒有分配內(nèi)存 s =newString(oldstring // 分配內(nèi)存 s = newstring // 重新分配內(nèi)存(創(chuàng)建新對象)
我們將在以后訪問 String 類時(shí)將更加明白它的工作過程, 但它的快速工作過程是這樣的:1. 創(chuàng)建一個(gè)新的 String 類對象并填充以 oldstring 2. 創(chuàng)建另一個(gè) String 對象并填充以 newstring 注意我們創(chuàng)建了兩個(gè)對象。Stirng 對象 oldstring Stirng 對象 newstring
在第三條語句里, 第一個(gè)包括 oldstring 的叫做 s 的對象已走出了有效范圍, 沒有任何方法可以再訪問他, 我們現(xiàn)在有一個(gè)新的對象也叫 s, 包含 newstring。在下一個(gè)廢品回收線程, 前一個(gè)對象將被標(biāo)識并清除。
3.4 子類
子類是利用存在的對象創(chuàng)建一個(gè)新對象的機(jī)制, 比如, 如果你有一個(gè) Horse 類, 你可以創(chuàng)建一個(gè) Zebra 子類,Zebra 是 Horse 的一種。
classZebraextendsHorse{intnumber_OF_stripes:}
關(guān)鍵詞 extends 來定義對象有的子類.Zebra 是 Horse 的子類。Horse 類里的所有特征都將拷貝到 Zebra 類里, 而 Zebra 類里可以定義自己的成員函數(shù)和實(shí)例變量。Zebra 稱為 Horse 的派生類或繼承。另外, 你也許還想覆蓋基類的成員函數(shù)。用 ClassOne 說明, 下面是一個(gè)派生類覆蓋 Add_i 功能的例子.
importClassOne;publicclassNewClassextendsClassOne{publicvoidAdd_i(intj){i=i+(j/2);}}
當(dāng) NewClass 類的實(shí)例創(chuàng)建時(shí), 變量 i 初始化值為 10, 但調(diào)用 Add_i 產(chǎn)生不同的結(jié)果。NewClassmnc;mnc=newNewClass();mnc.Add_i(10);
訪問控制 Java 里當(dāng)你創(chuàng)建一個(gè)新類時(shí), 你可以標(biāo)明變量和成員函數(shù)的訪問層次。
publicpublicvoidAnyOneCanAccess(){}public 實(shí)例變量和成員函數(shù)可以任意其它類調(diào)用。
protectedprotectedvoidOnlySubClasses(){}protected 實(shí)例變量和成員函數(shù)只能被其子類調(diào)用.
privateprivateStringCreditCardNumber;private 實(shí)例變量和成員函數(shù)只能在本類里調(diào)用.
friendlyvoidMyPackageMethod(){}缺省的, 如果沒有定義任何防火控制, 實(shí)例變量或函數(shù)缺省定義成 friendly, 意味著可以被本包里的任意對象防問, 但其它包里的對象不可防問。
靜態(tài)成員函數(shù)和變量有?copy; 時(shí)候, 你創(chuàng)建一個(gè)類, 希望這個(gè)類的所有實(shí)例都公用一個(gè)變量。也就是說, 所有這個(gè)類的對象都只有實(shí)例變量的同一個(gè)拷貝。這種方法的關(guān)鍵詞是 static,例如:
classBlock{staticintnumber=50;}
所有從 Block 類創(chuàng)建的對象的 number 變量值都是相同的。無任在哪個(gè)對象里改變了 number 的值, 所有對象的 number 都跟著改變。同樣的, 你可以定義 static 成員函數(shù), 但這個(gè)成員函數(shù)不能訪問非 static 函數(shù)和變量。
classBlock{staticintnumber=50;intlocalvalue;staticvoidadd_local(){localvalue++;// 沒有運(yùn)行}staticvoidadd_static(){number++;// 運(yùn)行}}
3.5this 和 super
訪問一個(gè)類的實(shí)例變量時(shí),this 關(guān)鍵詞是指向這個(gè)類本身的指針, 在前面 ClassOne 例子中, 我們可以增加構(gòu)造函數(shù)如下:
publicclassClassOne{inti;publicClassOne(){i=10;}
publicClassOne(intvalue)this.i=value;}
publicvoidAdd_i(intj){i=i+j;}}
這里,this 指向 ClassOne 類的指針。如果在一個(gè)子類里覆蓋了父類的某個(gè)成員函數(shù), 但又想調(diào)用父類的成員函數(shù), 你可以用 super 關(guān)鍵詞指向父類的成員函數(shù)。
importClassOne;publicclassNewClassextendsClassOne{publicvoidAdd_i(intj){i=i+(j/2);super.Add_i(j);}}
下面程序里,i 變量被構(gòu)造函數(shù)設(shè)成 10, 然后 15,最后被父類 (ClassOne) 設(shè)成 25。
NewClassmnc;mnc=newNewClass();mnc.Add_i(10);
3.6 類的類型
至今為止, 我用在類前面只用了一個(gè) public 關(guān)鍵詞, 其實(shí)它有下面 4 種選擇:
abstract 一個(gè) abstract 類必須至少有一個(gè)虛擬函數(shù), 一個(gè) abstract 類不能直接創(chuàng)建對象, 必須繼承子類后才能。
final 一個(gè) final 類聲明了子類鏈的結(jié)尾, 用 final 聲明的類不能再派生子類。
publicpublic 類能被其它的類訪問。在其它包里, 如果想使用這個(gè)類必須先 import, 否則它只能在它定義的 package 里使用。
synchronicable 這個(gè)類標(biāo)識表示所有?copy; 類的成員函數(shù)都是同步的。
3.7 抽象類
面向?qū)ο蟮囊粋€(gè)最大優(yōu)點(diǎn)就是能夠定義怎樣使用這個(gè)類而不必真正定義好成員函數(shù)。如果程序由不同的用戶實(shí)現(xiàn)時(shí)是很有用的,這不需用戶使用相同的成員函數(shù)名。
在 java 里 Graphics 類里一個(gè) abstract 類的例子如下:publicabstractclassGraphics{publicabstractvoiddrawLine(intx1,inty1,intx2,inty2);publicabstractvoiddrawOval(intx,inty,intwidth,intheight);publicabstractvoiddrawRect(intx,inty,intwidth,intheight);…}
在 Graphics 類里聲明了幾個(gè)成員函數(shù), 但成員函數(shù)的實(shí)際代碼是在另外一?copy; 地方實(shí)現(xiàn)的。
publicclassMyClassextendsGraphics{publicvoiddrawLine(intx1,inty1,intx2,inty2){畫線程序代碼}}
當(dāng)一個(gè)類包含一個(gè) abstract 成員函數(shù), 這個(gè)類必須定義為 abstract 類。然而并不是 abstract 類的所有的成員函數(shù)都是 abstract 的。Abstract 類不能有私有成員函數(shù)(它們不能被實(shí)現(xiàn)), 也不能有靜態(tài)成員函數(shù)。
3.8 接口
當(dāng)你確定多個(gè)類的操作方式都很相象時(shí),abstract 成員函數(shù)是很有用的。但如果你需要使用這?copy;abstract 成員函數(shù),必須創(chuàng)建一個(gè)新類,這樣有時(shí)很繁瑣。接口提?copy; 了一種抽象成員函數(shù)的有利方法。一個(gè)接口包含了在另一個(gè)地方實(shí)現(xiàn)的成員函數(shù)的收集。成員函數(shù)在接口里定義為 public 和 abstract。接口里的實(shí)例變量是 public,static 和 final。接口和抽象的主要區(qū)別是一個(gè)接口提?copy; 了封裝成員函數(shù)協(xié)議的方法而不必強(qiáng)迫用戶繼承類。
例子:publicinterfaceAudiClip{//Startplayingtheclip.voidplay();//Playtheclipinaloop.voidloop();//Stopplayingtheclipvoidstop();}
想使用 AudioClip 接口的類使用 implenents 關(guān)鍵詞來提?copy; 成員函數(shù)的程序代碼。classMyClassimplementsAudioClip{voidplay(){實(shí)現(xiàn)代碼}voidloop 實(shí)現(xiàn)代碼 }voidstop 實(shí)現(xiàn)代碼 }}
優(yōu)點(diǎn)一個(gè)接口類可以被任意多的類實(shí)現(xiàn),每個(gè)類可以共享程序接口而不必關(guān)心其它類是怎樣實(shí)現(xiàn)的。classMyOtherClassimplementsAudioClip{voidstop(){實(shí)現(xiàn)代碼}…}
內(nèi)部成員函數(shù) Java 還提?copy; 了調(diào)用 C 和 C ++ 函數(shù)的方法。用 native 關(guān)鍵詞來定義 C 和 C ++ 的函數(shù)。
publicclassDate{intnow;publicDate(){now=time();}privatenativeinttime();
static{System.loadLibrary( time}}
一?copy;Java 代碼寫好后, 就需要以下步驟執(zhí)行:1. 用 javah 來創(chuàng)建頭文件(.h)2. 用 javah 來創(chuàng)建 stub 文件 3. 用 C 和 C ++ 寫 native 成員函數(shù)的代碼 4. 編譯 stub 文件和.C 文件成一個(gè)動(dòng)態(tài)可加載庫 5. 用 java 運(yùn)行 java 程序或 appletviewer 運(yùn)行 applet
注意:Native 成員函數(shù)超出了類的范圍。
3.9 包(Packages)
包 (Package) 由一組類 (class) 和界面 (interface) 組成。它是管理大型名字空間,避免名字沖突的工具。每一個(gè)類和界面的名字都包含在某個(gè)包中。按照一般的習(xí)慣,它的名字是由“.”號分隔的單詞構(gòu)成,第一個(gè)單詞通常是開發(fā)這個(gè)包的組織的名稱。
定義一個(gè)編譯單元的包編譯單元的包由 package 語句定義。如果使用 package 語句,編譯單元的第一行必須無空格,也無注釋。其格式如下:packagepackageName; 若編譯單元無 package 語句,則該單元被置于一個(gè)缺省的無名的包中。
使用其它包中的類和界面在 Java 語言里提?copy; 一個(gè)包可以使用另一個(gè)包中類和界面的定義和實(shí)現(xiàn)的機(jī)制。用 import 關(guān)鍵詞來標(biāo)明來自其它包中的類。一個(gè)編譯單元可以自動(dòng)把指定的類和界面輸入到它自己的包中。在一個(gè)包中的代碼可以有兩種方式來定義來自其它包中的類和界面:* 在每個(gè)引用的類和界面前面給出它們所在的包的名字;// 前綴包名法 acme.project.FooBarobj=newacme.project.FooBar();* 使用 import 語句,引入一個(gè)類或一個(gè)界面,或包含它們的包。引入的類和界面的名字在當(dāng)前的名字空間可用。引入一個(gè)包時(shí),則該包所有的公有類和界面均可用。其形式如下:// 從 acme.project 引入所有類 importacme.project.*; 這個(gè)語句表示 acme.project 中所有的公有類被引入當(dāng)前包。以下語句從 acme.project 包中進(jìn)入一個(gè)類 Employec_List。// 從 acme.project 而引入 Employee_Listimportacme.project.Employee_list;Employee_Listobj=newEmployee_List(); 在使用一個(gè)外部類或界面時(shí),必須要聲明該類或界面所在的包,否則會(huì)產(chǎn)生編譯錯(cuò)誤。
import(引用)類包 (classpackage) 用 import 關(guān)鍵詞調(diào)入, 指定 package 名字如路徑和類名, 用 * 匹配符可以調(diào)入多于一個(gè)類名。
importjava.Date;importjava.awt.*;
如果 java 源文件不包含 package, 它放在缺省的無名 package。這與源文件同目錄,類可以這樣引入:importMyClass。
Java 系統(tǒng)包:Java 語言提?copy; 了一個(gè)包含窗口工具箱,實(shí)用程序,一般 I /O, 工具和網(wǎng)絡(luò)功能的包。
java.applet 這個(gè)包包含量了一?copy; 設(shè)計(jì) applet 的類, 用一個(gè)類 Applet 和三個(gè)接口.AppletContext;AppletStub; 和 AudioClip.
java.awt 另一個(gè)窗口工具箱包.awt, 包含了一?copy; 產(chǎn)生裝飾物和 GUI 成員的類。這個(gè) package 包括:Button,Checkbox,Choice,Component,Graphics,Menu,Pane1,TextArea 和 TextField。
java.ioI/Opackage 包含文件輸入 / 輸出類,F(xiàn)ileInputStream 和 FileOutputStream.
java.lang 這個(gè)包包含 Java 語言類, 包含: 對象, 線程, 異常出口, 系統(tǒng), 整數(shù), 原點(diǎn), 數(shù)學(xué), 字符等。
java.net 這個(gè)類支持 TCP/IP 網(wǎng)絡(luò)協(xié)議,并包含 Socket 類,URL 和 URL 相聯(lián)系的類。
java.util 這個(gè)類包含一?copy; 程序的同步類, 它包含 Date,Dictionary 類等。
3.10 異常
當(dāng)在 Java 程序中發(fā)生一個(gè)錯(cuò)誤時(shí),例如:一個(gè)變元的值非法,代碼會(huì)發(fā)現(xiàn)這個(gè)錯(cuò)誤,并引發(fā)一個(gè)異常 (exception)。在缺省的情況下,異常會(huì)輸出一個(gè)錯(cuò)誤消息,然后中止線程的執(zhí)行。但是,程序自己可以定義異常處理段(exceptionhandler) 來截獲 (catch) 異常,并從錯(cuò)誤中恢復(fù)。有一?copy; 異常是由 Java 解釋器在運(yùn)行時(shí)刻引發(fā)的。實(shí)際上,任何類都可以定義屬于自己的異常,并使用 throw 語句引發(fā)它們。一個(gè) throw(引發(fā)?copy; 語句是由 throw 關(guān)鍵字和一個(gè)對象構(gòu)成。按常規(guī),該對象應(yīng)該是 Exception 類的實(shí)例或其子類的實(shí)例。throw 語句會(huì)引起執(zhí)行轉(zhuǎn)向相應(yīng)的異常處理段。當(dāng)一個(gè) throw 語句執(zhí)行時(shí),它下面的所有代碼不再執(zhí)行了,它所在的方法也不再返回值。下面的例子將演示如何創(chuàng)建一個(gè) Exception 的子類,然后引發(fā)一個(gè)異常。classMyExceptionextendsException{}classMyClass{voidoops(){if(/* 不出現(xiàn)錯(cuò)誤 */){…}else{/* 出錯(cuò) */
}else{/* 出錯(cuò) */thrownewMyException();}}}為了定義一個(gè)異常處理段,程序必須用 try 語句把可能產(chǎn)生異常的代碼成組。在 try 語句后面跟上一個(gè)或多個(gè) catch(截獲?copy; 語句,每個(gè)異常對應(yīng)一個(gè) catch 語句。每個(gè) catch 語句中包含著異常處理段。例如:try{p.a=10;}catch(NullPointerExceptione){println(“pwasnull”);}catch(Exceptione){println(“othererrorsoccured”);}catch(Objectobj){println(“Whothrewthatobject?”);}catch 語句和一個(gè)方法定義類似,只不過該方法只有一個(gè)參數(shù),且無返回類型。參數(shù)可以是一個(gè)類或一個(gè)界面。當(dāng)一個(gè)異常發(fā)生時(shí),嵌套的 try/catch 語句會(huì)尋找出與該異常類相匹配的參數(shù)。如果一個(gè)參數(shù)和指定異常匹配則:* 該參數(shù)和指定的異常是同一個(gè)類,或 * 該參數(shù)是指定異常的子類,或 * 如果參數(shù)是一個(gè)界面,指定異常類實(shí)現(xiàn)了這個(gè)界面。第一個(gè)參數(shù)和異常匹配的 try/catch 語句,則與其匹配的 catch 語句執(zhí)行。在 catch 語句執(zhí)行完后,程序的執(zhí)行被恢復(fù)。但已不可能恢復(fù)到異常發(fā)生處再次執(zhí)行。例如:print(now try{print( is thrownewMyException();print(a}catch(MyExceptione){print( the}print(time\n 打印為“nowisthetime”。正如這個(gè)例子所示,異常應(yīng)該主要用于錯(cuò)誤處理,若用于其它方面會(huì)使代碼晦澀難?reg;。異常處理段是可以嵌套的,允許異常處理可以發(fā)生在多個(gè)地方。嵌套異常處理通常用于當(dāng)?shù)谝粋€(gè)處理程序無法完全從錯(cuò)誤中恢復(fù)過來的時(shí)候,而不得不執(zhí)行一?copy; 清除代碼。為了把異常處理控制傳遞給更高層的處理段,可以再一次對截獲對象實(shí)?copy;throw 操作。注要再次實(shí)?copy;throw 異常的方法,throw 語句執(zhí)行完后,會(huì)終止執(zhí)行。try{f.open();}catch(Exceptione){f.close();throwe;}
定局語句 finally(定局?copy; 語句是用于保證無論在異常是否發(fā)生的情況下,某?copy; 代碼被執(zhí)行。下例說明 finally 語句的用法:try{// 做某?copy; 動(dòng)作;}finally{// 此后清除;}和以下代碼類似 try{// 做某?copy; 動(dòng)作}catch(Objecte){// 此后清除;throwe;}
}// 此后清除;即使 try 塊中包含 return,break,continue,throw 語句,finally 語句也會(huì)被執(zhí)行。例如:下面的代碼“finally”總是被輸出,而“aftertry”僅在 a!=10 時(shí)被輸出。try{if(a==10){return;}}finally{print( finally\n }print( aftertry\n
運(yùn)行時(shí)刻異常本節(jié)列出的清單是 Java 解釋器引發(fā)的各種異常。當(dāng)運(yùn)行時(shí)刻發(fā)現(xiàn)各種錯(cuò)誤,由解釋器引發(fā)異常。
ArithmeticException 如果程序試圖除 0,或用 0 取模,會(huì)產(chǎn)生 ArithmeticException(算術(shù)異常?copy;,其它算術(shù)操作不會(huì)產(chǎn)生異常。有關(guān) Java 如何處理其它算術(shù)錯(cuò)誤的信息,見“整數(shù)運(yùn)算符”和“浮點(diǎn)運(yùn)算符”兩節(jié)。例如:下面的代碼將會(huì)引發(fā) ArithmeticException 異常:classArith{publicstaticvoidmain(Stringargs[]){intj=0;j=j/j;}}
NullPointerException 當(dāng)程序試圖訪問一個(gè)空對象中的變量或方法,或一個(gè)空數(shù)組中的元素時(shí)則引發(fā) NullPointerException(空指針異常?copy;。例如,訪問長度為 0 的數(shù)組 a[0]。有以下類聲明,運(yùn)行時(shí)會(huì)引發(fā) NullPointerException 異常:classNull{publicstaticvoidmain(Stringargs[]){Stringo=null;inta[]=null;o.length();a[0]=0;}}有趣的是,如果我們引發(fā)一個(gè)空對象,也會(huì)產(chǎn)一 NullPointerException 異常。
IncompatibleClassChangeException 當(dāng)一個(gè)類的定義被改變,而引用該類的其它類沒有被重新編譯時(shí),會(huì)產(chǎn)生這一異常。有四種類更改會(huì)導(dǎo)致運(yùn)行時(shí)刻引發(fā) IncompatibleClassChangException 異常。* 一個(gè)類中的變量聲明由 static 變成非 static,而其它訪問該類這一變量的類沒有被重新編譯。* 一個(gè)類中的變量聲明由非 static 變成 static,而其它訪問該類這一變量的類沒有被重新編譯。* 類中聲明的某個(gè)域被刪除,而其它訪問該域的類沒有被重新編譯。* 類中聲明的某個(gè)方法被刪除,而其它訪問該方法的類沒有被重新編譯。
ClassCastException 如果試圖把對象 o 強(qiáng)制成 ClassC,而 o 既不是 ClassC 的實(shí)例,也不是 ClassC 子類的實(shí)例,這時(shí)便會(huì)產(chǎn)生 ClassCastException。classClassCast{publicstaticvoidmain(Stringargs[]){Objecto=newObject();Strings=(string)o;s.length();}}
}
NagativeArraySizeException 如果一個(gè)數(shù)組的長度是負(fù)數(shù),則會(huì)引發(fā) NagativeArraySizeException(數(shù)組負(fù)下標(biāo)?copy; 異常。例如下面類定義的代碼在運(yùn)行時(shí)引發(fā)這一異常:classNegArray{publicstaticvoidmain(Stringargs[]){inta[]=newint[-1];a[0]=0;}}
OutOfMemoryException 當(dāng)系統(tǒng)無法再向應(yīng)用程序提?copy; 內(nèi)存時(shí),會(huì)引發(fā) OutOfMemoryException(內(nèi)存溢出?copy; 異常。這種異常只能出現(xiàn)在創(chuàng)建新對象的時(shí)候,即 new 被調(diào)用的時(shí)候。例如,下面一段代碼在運(yùn)行時(shí)刻會(huì)引發(fā) OutOfMemoryException 異常:classLink{inta[]=newint[1000000];Linkl;}ClassOutOfMem{publicstaticvoidmain(Stringargs[]){
publicstaticvoidmain(Stringargs[]){Linkroot=newlink();Linkcur=root;while(true){cur.l=newLink();cur=cur.l;}}}
NoClassDefFoundException 如果一個(gè)類被引用,但在運(yùn)行時(shí)刻,系統(tǒng)沒有找到被引用的類,這時(shí)會(huì)引發(fā) NoClassDefFoundException(未找到類定義?copy; 異常。例如,NoClass 類的聲明如下:classNoClass{publicstaticvoidmain(Stringargs[]){Cc=newC();}}當(dāng) NoClass 運(yùn)行時(shí),如果解釋器找不到 C 類,則會(huì)產(chǎn)生 NoClassDefFoundException。注意,在 NoClass 被編譯時(shí) C 類一定要存在。
IncompatibleTypeException 如果試圖為一界面作實(shí)例,則會(huì)引發(fā) IncompatibleTypeException(類型不兼容?copy; 異常。例如,下面的代碼會(huì)引發(fā)一個(gè) IncompatibleTypeException。InterfaceI{}classIncompType{publicstaticvoidmain(Stringargs[]){Ir=(I)new(I}}
ArrayIndexOutOfBoundsException 試圖訪問數(shù)組中的一個(gè)非法元素時(shí),會(huì)引發(fā) ArrayIndexOutOfBoundsException(數(shù)組索引越界?copy; 異常。例如:ClassArrayOut{publicstaticvoidmain(Stringargs[]){inta[]=newint[0];a[0]=0;}}
publicstaticvoidmain(Stringargs[]){inta[]=newint[0];a[0]=0;}}UnsatisfiedLinkException 如果一個(gè)方法被聲明為本機(jī),但該方法在運(yùn)行時(shí)刻卻不能連接到一個(gè)例程體上去時(shí),會(huì)產(chǎn)生 UnsatisfiedLinkException(無法連接?copy; 異常。例如:ClassNoLink{staticnativevoidfoo();publicstaticvoidmain(Stringargs[]){foo();}}
InternalExceptionInternalException(內(nèi)部?copy; 異常是不能被引發(fā)的。只有在運(yùn)行失敗作一致性檢查時(shí),才會(huì)引發(fā)這個(gè)異常。
關(guān)于 Java 程序設(shè)計(jì)基礎(chǔ)是怎樣的就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。