- package com.lj.test;
- class Number{
- int i;
- }
- public class Test {
- public static void main(String[] args) {
- Number n1 = new Number();
- Number n2 = new Number();
- n1.i = 9;
- n2.i = 47;
- System.out.println("1:n1.i="+n1.i+",n2.i="+n2.i);
- n1 = n2;
- System.out.println("2:n1.i="+n1.i+",n2.i="+n2.i);
- n1.i = 27;
- System.out.println("3:n1.i="+n1.i+",n2.i="+n2.i);
- }
- }
猜猜結果會是啥樣呢?
1:n1.i=9,n2.i=47
2:n1.i=47,n2.i=47
3:n1.i=27,n2.i=27
開始我們實例化了兩個對象n1和n2,並且對其i值都賦予相應的值。然後吧n2賦值給n1,再修改n1。在很多別的編程語言裏,你可以設想n1和n2自始至終都是兩個獨立的對象。但在Java裏面,對n1的修改會影響到n2!我們可以看出這時n1和n2使用同一塊內存,而原來的n1對象所佔用的內存則會被垃圾回收器清理掉。我個人認爲,我們在賦值操作時經常會馬虎的認爲會輸出結果:3:n1.i=27,n2.i=47。
下面我參考Thinking in Java 3rd Edition又做個了例子發現,在方法調用的時候,傳遞參數時也要注意:
- package com.lj.test;
- class Number{
- int i;
- }
- public class Test {
- public static void f(Number n){
- n.i = 88;
- }
- public static void main(String[] args) {
- Number n3 = new Number();
- n3.i = 33;
- System.out.println("n3.i:"+n3.i);
- f(n3);
- System.out.println("n3.i:"+n3.i);
- }
- }
輸出結果爲:
n3.i:33
n3.i:88
通過兩個例子我總結一下吧,在基礎類型的賦值時是對值的複製操作,而對對象的賦值則是內存地址引用操作(包括以對象爲參數的也是內存地址的引用操作),當多個對象都引用了此內存地址時,其中任何一個對象發生改變 其他引用同一塊內存的對象也會受到影響。