總網頁瀏覽量

2013年3月7日 星期四

巢狀類別Nested Class

巢狀類別:一個類別之內再定義一個類別。
優點:可以存取外部類別的private成員



static 內部類別:
類別裡面再宣告一個static類別。依附於"外部類別"上
特性:只能存取外部類別的static成員,不能存取實體成員。
因為實體成員是物件層級的,static是類別層級的。

內部類別是外部類別的成員。

package nestedclass;
class outer{
static int x = 1;//static 變數
int y=2;
private static int k =4;
public static class inner{
private int z = 3;
public void show(){
System.out.println("outer.x="+outer.x);//存取static變數
//System.out.println("Outer.thix.y="+outer.this.y);//無法存取y
System.out.println(outer.k);//存取private static變數
System.out.println(z);
}}

}
public class staticNestedclass {
    public static void main(String[] args) {
outer.inner inner = new outer.inner();//inner依附於外部"類別",所以以外部類別.內部類別()建立物件
inner.show();
    }}




實體內部類別
類別內部再宣告non-static類別。依附在物件實體上。
內部類別是外部類別的成員。


package nestedclass;
class outer{
   private static int x = 1;
 static int y=2;
 int k= 3;
public class inner{
private int z = 3;
public void show(){
System.out.println("outer.x="+outer.x);//存取private成員,也可在x前面加上this
System.out.println("Outer.thix.y="+outer.this.y);//static成員也可用this去存,this表示outer的物件
System.out.println(this.z);//這裡this表示inner物件
System.out.println(outer.this.k);
}}}
public class staticNestedclass {
    public static void main(String[] args) {
outer.inner inner = new outer().new inner();//實體內部類別依附於物件實體上所以要先new outer()才實體化內部類別物件。
inner.show();    }}




方法內部類別
將類別宣告在外部類別的方法裡面,此時內部類別是方法裡面的類別,不是外部類別的成員。內部類別宣告規則跟方法內變數一樣,不可加static以及存取修飾詞。
方法內部類別可以存取外部類別成員,
但是方法裡面的區域變數必須冠上final修飾詞,才能被內部類別存取
(原因是加上final宣告時強制給予變數初始值)



package nestedclass;
class outerclass{
static int x =1;
int y =2;
private int k=3;
public void outermethod(final int a){
int b=5;

class inner{
 int z = 4;
public void show(){
System.out.println("x="+x);
System.out.println("y="+y);
System.out.println("k="+k);
System.out.println("z="+z);
System.out.println("a="+a);//存取外部類別的方法裡的區域變數
//System.out.println("b="+b);//

}
}
    inner inner = new inner();//物件宣告必須放在,類別宣告之後
    inner.show();  
}}

public class methodinnerclass {
    public static void main(String[] args) {
        outerclass outer = new outerclass();
        outer.outermethod(100);      
    }
}




匿名內部類別
該內部類別只有宣告類別名稱、實作內容但沒有"物件"名稱。
用於實作介面或改寫類別上
可以參考interface文章

EX:

public class anonymous_inner_class {
   public static void main(String[] args) {

//小括號包住,只有new 物件沒有給名字,主要用來補足內部類別Caaa沒有定義到的method

        (
                new Caaa(){
                void set_num(int n){
                num=n;
                System.out.println(num);
                
                }
                
                }).set_num(5);//執行匿名內部類別定義的method
                               
    }  
       
static class Caaa{

        int num;        }
           
}





匿名內部類別常用於撰寫事件(event)。

沒有留言:

張貼留言