在學習webwork案例中碰到了靜態的內部類,抄篇文章來
(一)Java1.1以后版本添加了嵌套類(Inner Class,嵌套類、內部類)。嵌套類定義在類(外部類)里面。
嵌套類可以體現邏輯上的從屬關系。同時對于其他類可以控制內部類不可見等。
外部類的成員變量作用域是整個外部類,包括嵌套類。但外部類不能訪問嵌套類的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); //編譯錯
}
}
(二)下面演示了如何在外部類之外實例出一個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();
}
}
(三)當內部類與外部類有同名變量時,缺省指本類中的變量。
例子:public class Outer {
private int size;
public class Inner{
private size;
public void doStuff(int size){
size++; this.size++;
Outer.this.size++; // 錯誤,Outer.size++因為size不是靜態變量
}
}
public static void main(String args[]){
this.size++; //錯誤,靜態方法使用非靜態變量this
}
}
(四)在方法中定義一個嵌套類,注意嵌套類不可以訪問方法的局部變量。
因為方法的局部變量只存在與方法作用期間,故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);
}
}
(五)
嵌套類的類名必須與包裝它的外部類區別,且嵌套類的類名僅僅可以作用于定義范圍中。方法中定義類,其類名名就只能出現在方法中。
定義在方法中的嵌套類只能使用定義為final的局部變量,不可以使用方法中的非靜態變量。
嵌套類可以使用的變量種類包括:類變量、實例變量、final局部變量。
嵌套類同樣具有所有的訪問控制權限。高級類屬性:
嵌套類可以是abstract類
嵌套類可以是接口,被其它嵌套類實現。
定義為static的內部類將成為頂級類(top-level)。它們不依賴于外部類的對象而生成,所以不可以訪問外部類的對象成員。
非static內部類不能定義static成員
當外部類編譯時,內部類也會編譯,生成的類文件格式為:
OuterClass$InnerClass,如Outer$Inner.class
例子:
class Outer {
private int size =5;
static class Inner{
int value=5;
public void doStuff(){ size+=value; }// 錯誤,不能訪問非static 外部類程序
}
}
public class TestInner{
public static void main(String args[]){
Outer outer = new Outer();
Inner inner = new Inner();// 這種實例也不對
應該 Out.Inner innner=new Outer.Inner() ;
}
}
非static內部類不能定義static成員 ,
(1)定義 static 的 內部類, 如果成員變量也定義成 static ,那么外圍類可以直接通過類名來訪問。
(2)定義 static 的 內部類, 如果成員變量不是 static ,那么外圍類需要生成內部類的對象才能訪問,否則直接訪問導致編譯出錯!!
posted on 2006-04-21 01:13 靜夜思 閱讀(239) 評論(0) 編輯 收藏 所屬分類: j2ee基礎