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是按值传递的