Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在方法中更改对象的值会全局更改它吗?_Java_Scope_Parameter Passing - Fatal编程技术网

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

Java 在方法中更改对象的值会全局更改它吗?,java,scope,parameter-passing,Java,Scope,Parameter Passing,这是我的密码 A类 public class A { private int a; public int getA() { return a; } public void setA(int a) { this.a = a; } } 等级变更 public class Change { public void changeSomething(A a){ a.setA(13); } } 课

这是我的密码

A类

public class A {
    private int a;

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }
}
等级变更

public class Change {
    public void changeSomething(A a){
        a.setA(13);
    }
}
课堂学习

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

i、 e.我不需要做
a=改变某事(a)
并将此方法的返回类型设置为


谢谢

简短:

//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());
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());

您提供的代码直接作用于A的实例。无论您是否返回该实例,该实例都会更改。它仍然是您对象的同一实例。这个实例变量反映了新的值。

这是因为传递对象,Java中的对象总是通过引用传递的。仅原语(int、double、char、long…)通过值传递

在C中可以是:

public void changeSomething(A& a){
 a.setA(13);
}
您正在传递对原始对象的引用。当你写方法的时候

void someMethod(A param) { ... }
param
是对原始对象的引用。未复制原始对象。因此,当您更改此对象时,无论在何处观察到该对象,都可以看到更改

当你写作时:

private A a = new A();
必须认识到,变量是对对象类型
a
的引用,而不是实际的对象类型
a
。当然,这是一个很好的区别


上述行为可能会在整个系统中造成意外的影响,这是不变性的一个论据,特别是在可以从多个线程触发更改的线程化环境中。

对象没有被传递,只有引用的值被传递。我会争辩(并要求)一切都是按值传递的,包括对象引用+1到Brian Agnew!如果您使用C,那么如果您传递指针,您是否说数据是“通过引用”传递的?不,您只是说您传递了一个指针(通过值)。在Java中,总是有指向对象的指针(引用),而
操作符就像C/C++中的
->
一样。这就是为什么你可以将对象身份与 = > = /Cord>在爪哇中,你只是比较指针值。@ Br.AnEngNew,你是对的,但是解释可能会更混乱,然后需要。@ VAS-C++肯定。C有参考文献吗?有一个类似的问题