本帖最後由 tonyh 於 2019-6-22 14:53 編輯
內部類別(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.....,看它是外部類別中的第幾個匿名內部類別。 |