在學(xué)習(xí)webwork案例中碰到了靜態(tài)的內(nèi)部類,抄篇文章來
(一)Java1.1以后版本添加了嵌套類(Inner Class,嵌套類、內(nèi)部類)。嵌套類定義在類(外部類)里面。
嵌套類可以體現(xiàn)邏輯上的從屬關(guān)系。同時(shí)對于其他類可以控制內(nèi)部類不可見等。
外部類的成員變量作用域是整個(gè)外部類,包括嵌套類。但外部類不能訪問嵌套類的private成員。例子:
public class Outer {
private int size;
public class Inner{
private int counter = 10;
public void doStuff(){ size++; }
}
public static void main(String args[]){
Inner inner= new Inner();
inner.doStuff();
System.out.println(size);
System.out.println(inner.counter);
System.out.println(counter); //編譯錯(cuò)
}
}
(二)下面演示了如何在外部類之外實(shí)例出一個(gè)public Inner類對象。
類名前加上外部類類名,new語句前加上外部類的引用變量。這很類似package的使用。
例子:
public class Outer {
private int size;
public class Inner{
public void doStuff(){ size++; }
}
}
public class TestInner{
public static void main(String args[]){
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.doStuff();
}
}
(三)當(dāng)內(nèi)部類與外部類有同名變量時(shí),缺省指本類中的變量。
例子:public class Outer {
private int size;
public class Inner{
private size;
public void doStuff(int size){
size++; this.size++;
Outer.this.size++; // 錯(cuò)誤,Outer.size++因?yàn)閟ize不是靜態(tài)變量
}
}
public static void main(String args[]){
this.size++; //錯(cuò)誤,靜態(tài)方法使用非靜態(tài)變量this
}
}
(四)在方法中定義一個(gè)嵌套類,注意嵌套類不可以訪問方法的局部變量。
因?yàn)榉椒ǖ木植孔兞恐淮嬖谂c方法作用期間,故localvalue不可訪問。而final變量的生命周期超出了方法,所以fianlvalue可用。
public class Outer {
private int size =5;
public Object makeTheInner(int localvalue){
final int finalvalue = 6;
class Inner{
public String toString(){return (“Inner is”+size+localvalue+finalvalue);}
}
return new Inner();
}
public static void main(String args[]){
Outer outer = new Outer();
Object obj = outer.makeTheInner(47);
System.out.println(“The object is” + obj);
}
}
(五)
嵌套類的類名必須與包裝它的外部類區(qū)別,且嵌套類的類名僅僅可以作用于定義范圍中。方法中定義類,其類名名就只能出現(xiàn)在方法中。
定義在方法中的嵌套類只能使用定義為final的局部變量,不可以使用方法中的非靜態(tài)變量。
嵌套類可以使用的變量種類包括:類變量、實(shí)例變量、final局部變量。
嵌套類同樣具有所有的訪問控制權(quán)限。高級類屬性:
嵌套類可以是abstract類
嵌套類可以是接口,被其它嵌套類實(shí)現(xiàn)。
定義為static的內(nèi)部類將成為頂級類(top-level)。它們不依賴于外部類的對象而生成,所以不可以訪問外部類的對象成員。
非static內(nèi)部類不能定義static成員
當(dāng)外部類編譯時(shí),內(nèi)部類也會編譯,生成的類文件格式為:
OuterClass$InnerClass,如Outer$Inner.class
例子:
class Outer {
private int size =5;
static class Inner{
int value=5;
public void doStuff(){ size+=value; }// 錯(cuò)誤,不能訪問非static 外部類程序
}
}
public class TestInner{
public static void main(String args[]){
Outer outer = new Outer();
Inner inner = new Inner();// 這種實(shí)例也不對
應(yīng)該 Out.Inner innner=new Outer.Inner() ;
}
}
非static內(nèi)部類不能定義static成員 ,
(1)定義 static 的 內(nèi)部類, 如果成員變量也定義成 static ,那么外圍類可以直接通過類名來訪問。
(2)定義 static 的 內(nèi)部類, 如果成員變量不是 static ,那么外圍類需要生成內(nèi)部類的對象才能訪問,否則直接訪問導(dǎo)致編譯出錯(cuò)!!
posted on 2006-04-21 01:13 靜夜思 閱讀(241) 評論(0) 編輯 收藏 所屬分類: j2ee基礎(chǔ)