內部類:Java和C++的不同實現
阿新 • • 發佈:2018-12-26
內部類
內部類是在一個類中定義的另一個類
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++中 內部類是不可以這樣訪問外部類變數的.