Java 快速導覽 - 物件導向概念 巢狀類別

Java 程式裡,定義在類別中的類別被稱為巢狀類別 (nested class) ,有以下四類

種類層級Inner
static nested classmemberno
inner [non-static] classmemberyes
local classlocalyes
anonymous classonly the point where it is definedyes


大體上分為成員等級,以及區域變數等級,也就是定義在方法中。後者有 local class 及 anonymous class ,前者為 static nested class 及 inner [non-static] class ,我們在這裡介紹前者,也就是成員等級的巢狀類別。


以下程式示範 inner [non-static] class 的定義及使用
class InnerDemo {
    private int outernumber = 33;
    
    public void printNumber() {
        System.out.println("印出外層類別的數值");
        System.out.println(outernumber);
    }
    
    public void event() {
        InnerClass i = new InnerClass();
        i.printInner();
        i.printOuter();
    }
    
    private class InnerClass {
        private int innernumber = 77;
        
        public void printInner() {
            System.out.println("印出內層類別的數值");
            System.out.println(innernumber);
        }
        
        public void printOuter() {
            printNumber();
        }
    }
    
    public static void main(String[] args) {
        InnerDemo t = new InnerDemo();
        t.printNumber();
        t.event();
    }
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:InnerDemo.java
    功能:示範物件導向的基本觀念 
    作者:張凱慶
    時間:西元 2010 年 10 月 */


編譯後執行,結果如下



第 15 行到第 26 行即為 inner class 定義的地方
private class InnerClass {
    private int innernumber = 77;
        
    public void printInner() {
        System.out.println("印出內層類別的數值");
        System.out.println(innernumber);
    }
        
    public void printOuter() {
        printNumber();
    }
}


Inner class 中可以定義自己的屬性及方法,如同一般的類別定義。第 9 行到第 13 行
public void event() {
    InnerClass i = new InnerClass();
    i.printInner();
    i.printOuter();
}


event() 方法使用 InnerClass 類別建立實體物件,然後呼叫 InnerClass 的 printInner() 與 printOuter() 方法。這裡須留意, inner class 可以自由使用其他同等級的成員,但是反過來,與 inner class 同等級的成員無法直接使用 inner class 中所定義的屬性及方法,必須透過建立 inner class 的實體物件才可使用。


中英文術語對照
巢狀類別nested class
static nested classstatic nested class
inner classinner class
local classlocal class
anonymous classanonymous class






沒有留言: