1. 程式人生 > >關於類中定義自身類物件的問題

關於類中定義自身類物件的問題

在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成員只在類的物件被建立或類的靜態成員(方法)被呼叫時進行一次初始化,其後即再不建立和初始化。