Board logo

標題: 內部類別 [打印本頁]

作者: tonyh    時間: 2017-6-30 20:46     標題: 內部類別

本帖最後由 tonyh 於 2020-3-23 19:56 編輯

內部類別(Inner class)顧名思義,就是有個Class包在另一個Class裡面。非"static"的內部類別,依所在位置可以分為三種:成員內部類別(Member inner class)、區域內部類別(Local inner class)與匿名內部類別(Anonymous inner class)。



使用內部類別最大的好處在於可以直接存取外部類別的私用(private)成員,舉個例子來說,在視窗程式中,我們可以使用內部類別來實作一個事件傾聽者類別,這個視窗傾聽者類別可以直接存取視窗元件,而不用透過參數傳遞。

內部類別同樣也可以使用"public"、"protected"或"private"來修飾,而通常宣告為"private"的情況較多。

成員內部類別是直接宣告類別為成員,例如:
public class OuterClass {
    ….
    private class InnerClass {
        ....
    }
}


區域內部類別的使用與成員內部類別類似,區域內部類別定義於一個方法中,類別的可視範圍與生成之物件僅止於該方法之中,區域內部類別的應用一般較為少見。

匿名內部類別可以不宣告類別名稱,而使用new直接產生一個物件,該物件可以是繼承某個類別或是實作某個介面,內部匿名類別的宣告方式如下:
new 類別或介面() {
    // 實作
}


內部類別也可以宣告為static,被宣告為static的內部類別,通常是將外部類別當作名稱空間,例如:
public class Outer {
    public static class Inner {
        ....
    }
    ....
}


我們可以如以下的方式來使用Inner類別:
Outer.Inner inner = new Outer.Inner();

被宣告為static的內部類別,雖然將外部類別當作名稱空間,但算是個獨立類別,它可以存取外部類別static成員,但不可存取外部類別非static成員。

在檔案管理方面,具類別名稱的內部類別在編譯完成後,會產生檔案名稱為「外部類別名稱$內部類別名稱.class」的類別檔,而匿名內部類別則會在編譯完成後產生「外部類別名稱$編號.class」的類別檔,編號為1、2、3.....,看它是外部類別中的第幾個匿名內部類別。




歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://seed.istak.org.tw/) Powered by Discuz! 7.2