Java中請問將一個對象賦值給另一個同類對象,這兩個對象是否指向同一堆內存?


如題,再請問,改變前一個對象的成員變量,后一個對象的成員變量會改變嗎?那么如果會,那sun公司的這種設計有什么實際意義嗎?我實在想不明白這種設計有什么意義(前提是我前面用一個對象構造另一個對象,它們指向同一堆內存的這一假設成立、我這沒有環境,所以沒辦法試,要不我就自己先試一試了)、比如有一個類:Person,我現在有兩個對象,比如說雙胞胎兄弟,我初始化了哥哥,這個對象,我現在想用哥哥去構造弟弟、弟弟和哥哥其它都一樣,只是臉上多顆痣,但是如果賦值之后,它們指向同一堆內存的話,改變弟弟這一對象的成員變量(臉上有痣為true),那哥哥不也有痣了嗎?就達不到要的效果啦、怎么理解?怎么解決這種問題?

是的。

對象是引用類型的,所以如果把一個對象賦值給另一個變量,它實際上只是把內存地址賦值了。也就是說,如果對象都是同一地址,那么改變該地址的值,另外一個同地址的對象也會改變。

首先可以使用構造器的參數區別開兩個對象,如果要直接賦值而不互相影響,那么可以使用clone(淺復制、深復制包含內部引用等)方法如
Person newPerson=(Person)oldPerson.clone();這樣新舊對象是2個對象而不是共用一個地址的2個對象。

堆和棧

內存管理在Java語言中是JVM自動操作的,當JVM發現某些對象不再需要的時候,就會對該對象占用的內存進行重分配(釋放)操作,而且使得分配出來的內存能夠提供給所需要的對象。

在一些編程語言里面,內存管理是一個程序的職責,但是書寫過C++的程序員很清楚,如果該程序需要自己來書寫很有可能引起很嚴重的錯誤或者說不可預料的程序行為,最終大部分開發時間都花在了調試這種程序以及修復相關錯誤上。


對象是引用類型的,所以如果你把一個對象賦值給另一個變量,它實際上只是把內存地址賦值了。

也就是說,如果你的對象都是同一地址,那么改變該地址的值,另外一個同地址的對象也會改變。
比如

List a = new ArrayList(); 
a.add("a");
List b=a;
b.add("b");
System.out.println(a);
//output:[a,b]

這里邊的a、b就是同一地址;
但是有賦值的則不會如此:
String a="a";
String b=a;
b="b";
System.out.println(a);//output:a
這里邊b的引用雖然指向了a但是后來的賦值讓它指向了新的地址,改變的不是原來地址的值;所以a沒有改變。


免責聲明!

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



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