1. 程式人生 > 其它 >假期java自學-----類4

假期java自學-----類4

一.內部類基礎
在Java中,可以將一個類定義在另一個類裡面或者一個方法裡面,這樣的類稱為內部類。廣泛意義上的內部類一般來說包括這四種:成員內部類、區域性內部類、匿名內部類和靜態內部類。下面就先來了解一下這四種內部類的用法。
1.成員內部類
成員內部類是最普通的內部類,它的定義為位於另一個類的內部,形如下面的形式:
classCircle{
doubleradius=0;
publicCircle(doubleradius){
this.radius=radius;
}
classDraw{//內部類
publicvoiddrawSahpe(){
System.out.println("drawshape");
}
}
}
這樣看起來,類Draw像是類Circle的一個成員,Circle稱為外部類。成員內部類可以無條件訪問外部類的所有成員屬性和成員方法(包括private成員和靜態成員)。
classCircle{
privatedoubleradius=0;
publicstaticintcount=1;
publicCircle(doubleradius){
this.radius=radius;
}

classDraw{//內部類
publicvoiddrawSahpe(){
System.out.println(radius);//外部類的private成員
System.out.println(count);//外部類的靜態成員
}
}
}
不過要注意的是,當成員內部類擁有和外部類同名的成員變數或者方法時,會發生隱藏現象,即預設情況下訪問的是成員內部類的成員。如果要訪問外部類的同名成員,需要以下面的形式進行訪問:
外部類.this.成員變數
外部類.this.成員方法
雖然成員內部類可以無條件地訪問外部類的成員,而外部類想訪問成員內部類的成員卻不是這麼隨心所欲了。在外部類中如果要訪問成員內部類的成員,必須先建立一個成員內部類的物件,再通過指向這個物件的引用來訪問:
classCircle{
privatedoubleradius=0;
publicCircle(doubleradius){
this.radius=radius;
getDrawInstance().drawSahpe();//必須先建立成員內部類的物件,再進行訪問
}
privateDrawgetDrawInstance(){
returnnewDraw();
}
classDraw{//內部類
publicvoiddrawSahpe(){
System.out.println(radius);//外部類的private成員
}
}
}
成員內部類是依附外部類而存在的,也就是說,如果要建立成員內部類的物件,前提是必須存在一個外部類的物件。建立成員內部類物件的一般方式如下:
publicclassTest{
publicstaticvoidmain(String[]args){
//第一種方式:
Outteroutter=newOutter();
Outter.Innerinner=outter.newInner();//必須通過Outter物件來建立
//第二種方式:
Outter.Innerinner1=outter.getInnerInstance();
}
}
classOutter{
privateInnerinner=null;
publicOutter(){
}
publicInnergetInnerInstance(){
if(inner==null)
inner=newInner();
returninner;
}
classInner{
publicInner(){
}
}
}
內部類可以擁有private訪問許可權、protected訪問許可權、public訪問許可權及包訪問許可權。比如上面的例子,如果成員內部類Inner用private修飾,則只能在外部類的內部訪問,如果用public修飾,則任何地方都能訪問;如果用protected修飾,則只能在同一個包下或者繼承外部類的情況下訪問;如果是預設訪問許可權,則只能在同一個包下訪問。這一點和外部類有一點不一樣,外部類只能被public和包訪問兩種許可權修飾。我個人是這麼理解的,由於成員內部類看起來像是外部類的一個成員,所以可以像類的成員一樣擁有多種許可權修飾。