2011-09-21 26 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; –