Java是按值传递的,对吗?

Java是按值传递的,对吗?,java,oop,object,pass-by-reference,pass-by-value,Java,Oop,Object,Pass By Reference,Pass By Value,可能重复: 为什么我的代码不起作用?我正在将一个对象传递给一个方法,但它不会修改我在main中创建的原始对象,这是为什么 public class TestRun{ public static void main(String[] args){ Test t1 = new Test(); Test t2 = new Test(); t2.x = 555; t2.y = 333;

可能重复:

为什么我的代码不起作用?我正在将一个对象传递给一个方法,但它不会修改我在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;
}

你在标题中回答了。Java是“按值传递”

这意味着该方法只接收对象引用
arg1
arg2
副本

但是,您可以通过执行以下操作来更改对象的内容

arg1.x=arg2.x
ary1.y=arg2.y
它的传递值是的

但您需要认识到的是,测试是引用类型。在C语言中,它们是指针


因此,在调用modifyObject(arg1,arg2)时,您实际上是在复制指针的值(即复制指针的内存地址,或者复制变量的值作为引用)

在函数modifyObject中:

arg1接收类型测试对象的地址,比如x1000 arg2接收对象的另一个地址,比如说x2000

arg1包含对对象的引用,但如果执行arg1=arg2,则只是告诉arg1指向另一个地址

这样,您就不会接触arg1所指对象的内容

arg1和arg2是函数中的局部变量。要对对象进行更改,您需要将地址指向存储该对象的内存,但不包括arg1.x或arg1.y

请注意,对象在内存中的某个位置,arg1/arg2/t1/t2只是说明它们的位置,它们不是“实际”对象

你的期望是什么?因此,您创建并打印对象
t1
,其
x,y
值分别为
999,1
。如果你把它打印出来,你就会得到它

$ java TestRun
The original valuess of X and Y are
X =  9999, Y = 1
After the modification 
X =  9999, Y = 1
所以。。。你的问题是什么

  • QJava是通过值传递的吗A:是
  • Q它不会修改原始对象吗A:没错,它不会被修改
  • Q为什么A:因为Java是按值传递的

Soo如果我这样做,原始对象将被修改?是的,你知道了。和+1到Sanjay.soo为了让我改变他们的价值观,我所要做的就是这样?arg1.x=arg2.x我说得对吗?对。这将把内存中的值从arg2指向的实例复制到arg1指向的实例。arg1.x=arg2.x;arg1.y=arg2.y;因此,原始对象的值将发生变化?是的,修改后将改变原始对象的值。值将为x=555和y=333;C++中的非本原类型是对象,但在爪哇中它隐含地是引用。引用是按值传递的。