假如java類里的成員變量是自身的對象


如題,假如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好的這個對象


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM