这是我的代码
Class A
public class A {
private int a;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
}
Class Change
public class Change {
public void changeSomething(A a){
a.setA(13);
}
}
Class Learn
public class Learn {
public static void main(String[] args) {
A a = new A();
Change change = new Change();
change.changeSomething(a);
System.out.println(a.getA());
}
}
输出为13.现在,当我将对象传递给changeSomething方法时,内部对象A的值已经更改,但为什么我会在该函数之外看到这种效果?
这不等于在C中传递值,除非你返回该变量/ Object,否则你得不到更新的值。
即。我不需要做a=changeSomething(a);
并将此方法的返回类型设置为A?
由于
答案 0 :(得分:2)
您将引用传递给原始对象。当你写一个方法
void someMethod(A param) { ... }
param
是原始对象的引用。原始对象未被复制。因此,当您更改此对象时,无论在何处观察到该对象,都可以看到更改。
当你写:
private A a = new A();
重要的是要意识到变量是对象类型A
的引用,而不是实际的对象类型A
。这是一个很好的区别,授予。
上述行为可能会对您的系统造成意外影响,并且它是 immutability 的参数,尤其是在可以从多个线程触发更改的线程环境中。
答案 1 :(得分:1)
简短:
changeSomething()
将更新对象的值,因此如果您引用相同的实例,您将获得相同的值
有点长的解释:
//an Object of A created and its reference is set to a
A a = new A();
//instance of Change is created and its reference is set to change
Change change = new Change();
//it passes reference's (a) 's value to the changeSomething method
//which invokes `setA()` on instance referred by a (which is the same instance that waas crated in line 1
change.changeSomething(a);
//so you will get the changed value here
System.out.println(a.getA());
答案 2 :(得分:1)
您提供的代码直接在A的实例上工作。无论您是否返回,该实例都会更改。它仍然是你对象的同一个实例。而这个实例变量反映了新的价值。
答案 3 :(得分:-3)
这是因为您传递了Object,Java中的对象总是通过引用传递。只有原始(int,double,char,long ...)按值传递。
在C中它可能是:
public void changeSomething(A& a){
a.setA(13);
}