關於類中定義自身類物件的問題
在C++的類定義中,是不能夠在類中定義自身類的物件的,但是可以定義自身類的指標物件和引用。
class A { public: A () { cout<<“Constructor method.”<<endl; }; A a; };
void main() { A aaaaa; }
以上程式碼編譯提示錯誤,a’ : uses ‘A’,which is being defined。
如果把a換成*a就可以了。
而java就可以在類中定義自身類的物件。
class a{ public a aa; }
這樣的程式碼可以順利編譯,但是如果在定義的時候建立了物件例項,則也會編譯失敗的。
class a{ public a aa = new a(); }
提示錯誤:
Exception in thread "main"java.lang.StackOverflowError at test1$abc.(test1.java:4)
很明顯,堆疊溢位了。
為什麼呢?其實以上問題的本質是一致的,就是是建立物件例項的時機問題。
在C++中,在定義物件的時候就建立了物件的例項,即分配了物件的記憶體空間。在java中,只有呼叫new的方法才能建立物件的例項,在記憶體中分配物件的空間。所以,如果在定義的時候就定義自身類的物件,就會導致遞迴建立物件的現象,建立了物件aa,因為aa是一個A類的例項,那麼aa中還有一個aa物件,還要建立一個aa物件,為其分配記憶體…………,這樣就會導致遞迴建立物件,結果就是記憶體被消耗殆盡。當然,這樣的設計本身也不合理。
在JAVA中,物件只有在new時才能建立物件例項,所以類中可以定義自身類的物件。如果把上例修改成令一個類的例項,則不會有任何問題。
class a{ public b bb = new b(); }
這樣的程式碼是可以編譯並執行的。
但如果在java的類中用new建立自身的物件時,將其宣告為static則是可以的。這是因為static成員只在類的物件被建立或類的靜態成員(方法)被呼叫時進行一次初始化,其後即再不建立和初始化。