轉(zhuǎn)帖|其它|編輯:郝浩|2009-01-13 11:50:08.000|閱讀 1303 次
概述:Java的聲明元素主要包括類(包括抽象類),接口,數(shù)組,異常和枚舉類型的聲明。其中各個(gè)部分又包含如下的各種基本元素: 類(包括抽象類):屬性聲明,構(gòu)造方法聲明,方法聲明,變量(注:這里的變量不包含屬性)。接口:接口常量和接口方法數(shù)組,異常,枚舉。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
文章關(guān)鍵字:|Java|聲明|訪問(wèn)|控制|權(quán)限|接口|數(shù)組|枚舉|重載|規(guī)則|
類的聲明:
1、類本身的聲明:
對(duì)類的聲明來(lái)說(shuō),主要包括類的訪問(wèn)權(quán)限聲明和非訪問(wèn)修飾符的使用。對(duì)于一個(gè)普通的Java類(POJO)來(lái)說(shuō),主要的訪問(wèn)權(quán)限修飾符只有兩個(gè)public和默認(rèn)權(quán)限,內(nèi)部類可以有private權(quán)限。非訪問(wèn)修飾符主要包括abstract,final和strictfp.
(1)這里先討論非訪問(wèn)修飾符,下面是基本的規(guī)則:
由上面的這些規(guī)則可以得出一個(gè)結(jié)論:一個(gè)類不可能既聲明為abstract的,又聲明為final的。
抽象類的實(shí)質(zhì)即為繼承它的類定義了一組行為準(zhǔn)則,任何繼承它的類都必須實(shí)現(xiàn)抽象類所定義的抽象方法,抽象類不可以實(shí)例化,抽象類中可以不包含抽象方法,但是含有抽象方法的類一定要聲明為抽象類。
final類表示一個(gè)類似不能被繼承的。如果你不希望一個(gè)類的行為被改變,或者說(shuō)該類的行為是整個(gè)系統(tǒng)的基礎(chǔ),就跟數(shù)學(xué)中的數(shù)字一樣的話,就可以把這個(gè)類聲明為final的。
(2)類的訪問(wèn)權(quán)限修飾符:
首先需要弄清楚的是類的訪問(wèn)包括哪些方面:
類的訪問(wèn)權(quán)限聲明為public的,表示該類可以被任意的類訪問(wèn),當(dāng)然,在其他類中訪問(wèn)該類時(shí),還是要在源文件的頭部做相應(yīng)的import工作。
類的訪問(wèn)權(quán)限為默認(rèn)權(quán)限,則表示和該類處在同一個(gè)包下的類可以訪問(wèn)它 ,此處注意以下比較容易忽視的地方:
源文件一:
package cert;
class test1 {}
源文件二:
package cert2;
import cert.test1;
public class test2 extends test1{}
這里test2類會(huì)產(chǎn)生錯(cuò)誤,因?yàn)閠est1是默認(rèn)訪問(wèn)權(quán)限,test2 使用繼承的方式訪問(wèn)test1,由于這兩個(gè)類不在同一個(gè)包中,因此test2是無(wú)法看到test1 的。
2、類的成員訪問(wèn)權(quán)限聲明
(1)訪問(wèn)權(quán)限的聲明:
類的成員可以使用全部的四種訪問(wèn)權(quán)限:public ,protected,默認(rèn),private。
這里需要記住的第一條準(zhǔn)則就是:判斷類的成員的訪問(wèn)權(quán)限,必須先判斷類的訪問(wèn)權(quán)限,如果整個(gè)類對(duì)于另一類來(lái)說(shuō)都是不可見的,那么這個(gè)類的所有成員都是不可見的。
類的成員的訪問(wèn)權(quán)限,當(dāng)涉及到子類時(shí)會(huì)變得很復(fù)雜,這里首先要弄清楚兩種訪問(wèn)的區(qū)別:
public成員訪問(wèn):
如果一個(gè)類的成員聲明為public,那么通過(guò)創(chuàng)建類的實(shí)例的方式,都是可以訪問(wèn)的,只要類的訪問(wèn)權(quán)限沒(méi)有問(wèn)題。通過(guò)繼承,子類可以擁有超類的public成員,而且,第三個(gè)類訪問(wèn)該子類時(shí),仍然可以訪問(wèn)子類所繼承的超類的成員。
舉例說(shuō)明如下:(注:三個(gè)類位于不同的源文件中)
package cert;
public class Test1 {
public String doThing(){
return "zhanglei ";
}
}
package cert2;
import cert.Test1;
class Test2 extends Test1{
public String doThing2(){
return "hello,"+doThing();
}
}
package cert2;
import cert2.Test2;
public class Test3{
public static void main(String[] args){
Test2 test=new Test2();
System.out.println(test.doThing2());
}
}
private 成員訪問(wèn): 表示該成員是該類的私有成員,任何類通過(guò)上面的兩種方式都是不可訪問(wèn)的。只可以在該類的定義中使用,或者通過(guò)該類的get和set方法來(lái)訪問(wèn)。
這里插一點(diǎn):一個(gè)類的構(gòu)造函數(shù)是可以被聲明為私有的,一旦該類的構(gòu)造方法被聲明為私有的,則必須提供一個(gè)public的方法來(lái)創(chuàng)建該類的實(shí)例,主要用在工廠模式和單態(tài)模式中。
另外一個(gè)需要注意的地方是:對(duì)于超類的私有方法,若在子類中出現(xiàn)了相同簽名的方法,這不是重寫。而只是剛好超類和子類的兩個(gè)方法相同。其理論依據(jù)就是:子類是不能繼承超類的私有方法的。[SPAN]
默認(rèn)成員訪問(wèn):
表示該類的成員在同一個(gè)包下的其他類中是可以通過(guò)上面兩種方式來(lái)訪問(wèn)的。
protected成員訪問(wèn):
這個(gè)訪問(wèn)權(quán)限是最麻煩的,分成兩種情況來(lái)討論:
1、當(dāng)考慮一個(gè)類通過(guò)創(chuàng)建另一個(gè)類的實(shí)例的方式實(shí)現(xiàn)訪問(wèn)時(shí),它產(chǎn)生的行為與默認(rèn)權(quán)限相同,既在同一個(gè)包中的類可以相互創(chuàng)建實(shí)例訪問(wèn)。這里有一種特殊情況:就是當(dāng)一個(gè)類是另一個(gè)類的子類時(shí),如果兩個(gè)類不在同一個(gè)包中,那么子類通過(guò)創(chuàng)建超類的實(shí)例的方式是不可以訪問(wèn)的,就和兩個(gè)基本類的行為一樣,這里不要受繼承關(guān)系的影響。
2、當(dāng)考慮一個(gè)類繼承另一個(gè)類的成員時(shí),當(dāng)超類的成員聲明為protected 的,則包內(nèi)和包外的繼承自它的子類都可以擁有該成員,而且對(duì)于子類來(lái)說(shuō),它通過(guò)繼承擁有的成員對(duì)它來(lái)說(shuō)是私有的,任何第三方的類都是不可訪問(wèn)的。
3、類的成員非訪問(wèn)權(quán)限的聲明: final:final類是防止有類繼承該類。final方法是防止該方法在子類中被重寫。另外final 關(guān)鍵字可以被用在方法的參數(shù),表示該參數(shù)是只讀的: public String getThing(int number1,final number2){}
abstract:聲明一個(gè)抽象方法,方法以分號(hào)結(jié)束,沒(méi)有大括號(hào)。
public String setSomething(); //抽象方法
public String setSomething(){ } //實(shí)例方法
abstract抽象方法不能被聲明為private的,因?yàn)槌橄蠓椒ㄊ冀K需要被重寫。
abstract抽象方法不能和static同用。
synchronized:只能用于方法聲明,表示方法一次只能被一個(gè)線程訪問(wèn)。
native:只能用于方法聲明,表示該方法是用其他的語(yǔ)言來(lái)實(shí)現(xiàn)的,native的方法體必須是以;分號(hào)結(jié)束,沒(méi)有方法體。
具有可變參數(shù)列表的方法:
舉例:void doStuff(int... x){}
void doStuff(String str,Animal... animal){}
規(guī)則是這樣的:
1、參數(shù)類型后面接省略號(hào)(...),一個(gè)空格,以及保存接收參數(shù)的數(shù)組名稱
2、可變參數(shù)必須是最后一個(gè)參數(shù),且方法中只能有一個(gè)可變參數(shù)。
接口的聲明:
1、接口聲明:與類本身的聲明相同,接口隱含是abstract的,因此不能聲明為final的。另外需要注意接口之間是可以多繼承的,使用extends關(guān)鍵字。
2、接口方法的聲明:接口的方法,隱含都是public和abstract的,因此接口方法不能聲明為final,static,private和protected的。
注意:接口和抽象類的方法聲明,其子類在實(shí)現(xiàn)這個(gè)方法時(shí),不能修改方法聲明的訪問(wèn)權(quán)限。
3、接口常量的聲明:接口內(nèi)允許放置常量,因此隱含public static final的,實(shí)現(xiàn)接口的類不能修改接口中定義的常量的值。[SPAN]
數(shù)組的聲明:
數(shù)組有兩種聲明方式:
int[] key;或者
int key[];
多維數(shù)組:
String[][] str;或者
String str[][];或者
String[] str[];
注意:數(shù)組聲明中,不能包含數(shù)組的長(zhǎng)度。
枚舉的聲明和定義:
1、枚舉的聲明:
枚舉的聲明位置有兩種:一種是單獨(dú)成類。另一種是放在類中,但是不能放在類的方法中。枚舉的訪問(wèn)修飾只能使用public和默認(rèn)。
枚舉不能被聲明為static,final ,abstract.
舉例: 第一種方式:enum Test{SMALL,MIDDLE,BIG};
第二種方式:
public class Test2{
enum Test{SMALL,MIDDLE,BIG};
Test test;
public static void main(String[] args){
Test2 test2=new Test2();
test2.test=Test.BIG;
}
}
2、枚舉的實(shí)質(zhì)及分析:枚舉的實(shí)質(zhì)就是一個(gè)類,拿Test枚舉來(lái)說(shuō),可以這樣類比:Test是一個(gè)類,它的成員是三個(gè)Test類型的對(duì)象SMALL,MIDDLE,BIG.
枚舉可以定義構(gòu)造函數(shù)和方法(因?yàn)槊杜e還是一個(gè)類)
例如:
enum Test{
SMALL(1),MIDDLE(2),BIG(3);//這里用整數(shù)值初始化了三個(gè)對(duì)象,隱式調(diào)用了構(gòu)造函數(shù)
Test(int num){
this.num=num;
}//這里定義了構(gòu)造函數(shù)
private int num;//枚舉類的核心參數(shù),可以做任意修改
public int getNum(){
return num;
}
}
注:枚舉類型的構(gòu)造函數(shù)是可以重載的。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:IT專家網(wǎng)