更改方法中对象的值会全局更改吗?

时间:2012-08-16 08:47:50

标签: java scope parameter-passing

这是我的代码

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?

由于

4 个答案:

答案 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);
}