1. 程式人生 > >內部類:Java和C++的不同實現

內部類:Java和C++的不同實現

內部類

內部類是在一個類中定義的另一個類
Java和C++都支援這麼做,且內部類和繼承是不同的,這兩種行為在記憶體排布上截然不同.

舉C++為例:
繼承:
class Derived : public Base {
xxx
};
內部類:
class Derived {
public:
    class Base {
    xxx
    };
};

同樣是在記憶體中例項化一個物件 Derived *tmp = new Derived();
繼承的話此時tmp指向的物件中包含Base類的資料
而內部類的話tmp指向的物件是不包含Base類的資料的.

同理Java也是這樣.

Java內部類的特殊性

Java的內部類在外部類例項化時同樣不會被例項化,也就是說物件的記憶體中不存在內部類
但Java內部類有一個很特殊的地方 即內部類可以訪問外部類的變數
所以這種情況下,一般Java程式碼都會在外部類中宣告一個內部類變數
class Derived {
private int mVal;
private Base mBase;
public class Base {
    void modify() {
        mVal = 1; // 內部類是可以訪問外部類變數的!
    }
}

public Derived {
    mBase = new Base();
}
}

這是因為Java類在構造內部類時 會拷貝一份外部類的變數的引用到內部類中
使得內部類可以訪問外部類的變數 這是編譯器做的工作

這是Java語言的特性 目的是為了方便Java程式的設計
而在C++中 內部類是不可以這樣訪問外部類變數的.