Java賦值與傳參時經常被忽視的問題

 

  1. package com.lj.test; 
  2.  
  3. class Number{ 
  4.     int i; 
  5. public class Test { 
  6.      
  7.     public static void main(String[] args) { 
  8.         Number n1 = new Number(); 
  9.         Number n2 = new Number(); 
  10.         n1.i = 9
  11.         n2.i = 47
  12.         System.out.println("1:n1.i="+n1.i+",n2.i="+n2.i); 
  13.         n1 = n2; 
  14.         System.out.println("2:n1.i="+n1.i+",n2.i="+n2.i); 
  15.         n1.i = 27
  16.         System.out.println("3:n1.i="+n1.i+",n2.i="+n2.i); 
  17.     } 

猜猜結果會是啥樣呢?

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又做個了例子發現,在方法調用的時候,傳遞參數時也要注意:

 

  1. package com.lj.test; 
  2.  
  3. class Number{ 
  4.     int i; 
  5. public class Test { 
  6.     public static void f(Number n){ 
  7.         n.i = 88
  8.     } 
  9.     public static void main(String[] args) { 
  10.         Number n3 = new Number(); 
  11.         n3.i = 33
  12.         System.out.println("n3.i:"+n3.i); 
  13.         f(n3); 
  14.         System.out.println("n3.i:"+n3.i); 
  15.     } 

輸出結果爲:

n3.i:33
n3.i:88

 

通過兩個例子我總結一下吧,在基礎類型的賦值時是對值的複製操作,而對對象的賦值則是內存地址引用操作(包括以對象爲參數的也是內存地址的引用操作),當多個對象都引用了此內存地址時,其中任何一個對象發生改變 其他引用同一塊內存的對象也會受到影響。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章