2011-09-21 63 views
1

可能重複:
Is Java pass by reference?Java是通過價值的權利?

怎麼會我的這個代碼不工作?我將一個對象傳遞給一個方法,但它不會修改我在main中創建的原始對象,爲什麼?

public class TestRun{ 

     public static void main(String[] args){ 
      Test t1 = new Test(); 
      Test t2 = new Test(); 
      t2.x = 555; 
      t2.y = 333; 

      System.out.println("The original valuess of X and Y are"); 
      System.out.println("X = "+t1.x+"Y = "+t1.y); 
      modifyObject(t1,t2); 
      System.out.println("After the modification "); 
      System.out.println("X = "+t1.x+"Y = "+t1.y); 


     } 

     public static void modifyObject(Test arg1,Test arg2){ 
      arg1 = arg2; 
     } 
} 

public class Test{ 

     int x = 9999; 
     int y = 1; 
} 
+0

C++中的非基元類型是一個對象,但在Java中它是隱含的引用。引用是按值傳遞的。 –

回答

2

您在標題中回答了它。 Java是「按價值傳遞」。

這意味着,該方法僅接收複製對象引用的arg1arg2

你可以,但是,改變內容對象的,由價值做

arg1.x=arg2.x 
ary1.y=arg2.y 
+0

Soo如果我這樣做,原來的對象會被修改? –

+0

是的,你明白了。和桑傑的+1。 – Perception

1

其通肯定。

但是你需要認識到的是Test是引用類型。在C中,他們會成爲指針。

所以當你調用modifyObject(arg1,arg2)時,你實際上在做的是複製指針的值(即複製指針的內存地址,或者將變量的值複製爲引用) 。

0

在功能modifyObject:

ARG1接收類型的測試對象的地址,讓我們說X1000 ARG2接收對象的另一個地址,讓我們說X2000

ARG1包含對對象的引用,但是如果你做了arg1 = arg2,你只是告訴arg1指向另一個地址。

這樣,你不接觸的ARG1

ARG1和ARG2指向的對象的內容在函數的局部變量。要對對象進行更改,需要將其存儲到內存中,但arg1.x或arg1.y

請注意,對象位於內存中某處,而arg1/arg2/t1/t2是隻是說他們在哪裏,他們不是「實際」的對象

+0

soo爲了讓我改變他們的價值觀,我所要做的就是這樣嗎? arg1.x = arg2.x是嗎? –

+0

是的。這會將內存中的值從arg2指向的實例複製到arg1指向的實例。 arg1.x = arg2.x; arg1.y = arg2.y;會做這項工作。 – galchen

+0

soo因此,orignal對象的值會改變? –

0

呃?!!

你的期望是什麼?因此,您創建和打印的對象t1其值分別爲999,1。如果你打印它,這就是你會得到的

$ java TestRun 
The original valuess of X and Y are 
X = 9999, Y = 1 
After the modification 
X = 9999, Y = 1 

所以......你又問了什麼?

  • 問題 Java是否按值傳遞?A:是
  • 問題它不會修改原始對象嗎? A:這是正確的,它不會被修改。
  • Q這是爲什麼? A:因爲Java通過值
+0

的值,其值爲x = 555,y = 333; –