0

这是我的代码

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 中按值传递,除非您返回该变量/对象,否则您不会获得更新的值。

即我不需要a=changeSomething(a);将此方法的返回类型设置为A吗?

谢谢

4

4 回答 4

2

您正在传递对原始对象的引用。当你写一个方法

void someMethod(A param) { ... }

param是对原始对象的引用。原始对象没有被复制。因此,当您更改此对象时,无论观察到该对象,更改都是可见的。

当你写:

private A a = new A();

重要的是要意识到变量是对对象类型的引用A,而不是实际的对象类型A。这是一个很好的区别,当然。

上述行为可能会在您的系统中造成意想不到的影响,并且它是immutability的一个论据,尤其是在可以从多个线程触发更改的线程环境中。

于 2012-08-16T08:53:51.300 回答
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());
于 2012-08-16T08:50:20.367 回答
1

好吧,您提供的代码直接在 A 的实例上工作。这个实例被更改,无论您是否返回它。它仍然是您的对象的同一个实例。这个实例变量反映了新值。

于 2012-08-16T08:51:01.210 回答
-3

这是因为你传递了 Object,而 Java 中的对象总是通过引用传递。只有原始(int、double、char、long...)是按值传递的。

在 C 中可能是:

public void changeSomething(A& a){
 a.setA(13);
}
于 2012-08-16T08:51:18.997 回答