如題,假如java類里的成員變量是自身的對象,則新建該類對象時內存中怎么分配空間,我感覺似乎死循環了。
不過我想的肯定是錯的,因為很多類的成員變量是自身對象,並且絕對無錯,舉個例子:
Class A{ private String b ="Hello"; private A a = new A(); } Class B{ public static void main(){ A p = new A(); } }
在程序執行中,要new一個A類型的對象p,這時為對象p開辟內存空間,其中一部分存放字符串b Hello,另一部分存放對象a,可是我感覺a是一個對象,應該再開辟一塊空間存放a這個對象,可是應該在里面放什么呢?一個是hello,另一個又是A類的對象?請各位幫忙解答,提前謝過!!!
---------------------------------------------------------------------
1.程序運行的時候會產生一個棧溢出錯誤的異常
Exception in thread "main" java.lang.StackOverflowError
你的思路是對的,在main方法中創一個A對象,而A對象在初始化自己成員的時候,又會創另一個A對象,從而造成死循環,最終導至內存溢出。
你的A類如下:
Class A{ private String b ="Hello"; private A a = new A(); }
通常程序不會像你這樣寫,而是
Class A{ private String b ="Hello"; private A a; //= new A(); public anymothod(...){ //在某條件滿足時 a=new A(); } }
也就是說類是自身成員的時候,通常不能初始化,而僅僅是一個定義,在滿足某些條件的時候,才去初始化,否則必然導至內存溢出。
2.可以給靜態的自身對象賦值,如
Class A{ private String b ="Hello"; private static final A a = new A(); }
3.因為a被修飾為static后第一次建的對象就被放在靜態區,再建對象時第二個成員變量就引用到該靜態區的對象
4.假如a被修飾為static后,只要new A類的對象,第二個成員變量對象就會被放在靜態區,而該對象中的第二個成員變量就不會在重新new了,因為它必須使用靜態區的已經new好的這個對象