1. 程式人生 > 其它 >Java中請問將一個物件賦值給另一個同類物件,這兩個物件是否指向同一堆記憶體?

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沒有改變。