Java对象作为函数参数传递

Wil*_*iam 0 java function object pass-by-reference pass-by-value

以下关于Java的声明是假的吗?

在Java中,当一个类或对象的实例被指定为方法的参数时,正在创建该对象的副本

我知道Java中的函数是按值传递的,这意味着正在制作对象的副本?

但与此同时,如果java对象是引用并且你传递了一个引用,这不同于实际数据的副本不是吗?

如果你传递一个引用,当重新分配引用时,对象将被重新分配,使得Java传递引用不是按值传递的?

如你所见,我对此非常困惑

Dav*_*INO 7

在java中,所有内容都通过副本传递.

原始文件通过副本传递.因此,在函数内部更改它不会在外部反映出来.

对于对象,传递给函数的引用的副本(不是对象的副本).这意味着更改函数内部的属性外部引用会看到修改,但更改引用本身(例如,赋值为null)不会反映在函数外部.


按照一些例子来解释更好.

改变原语的功能:

public void notChange(int a) {
    a = 3;
    // Here a is 3
}

int a = 0;

notChange(a);
// Here a is 0
Run Code Online (Sandbox Code Playgroud)

用于更改对象内部内容的函数

public void changeContent(List<String> list) {
    list.add("x");
    // Here list has one more element
}

List<String> list = new ArrayList<String>();
// Here list has size 0
changeContent(list);
// Here list has size 1
Run Code Online (Sandbox Code Playgroud)

对于更改对象引用的函数

public void changeReference(List<String> list) {
    list = null;
}

List<String> list = new ArrayList<String>();
changeReference(list);
// Here list is not null
Run Code Online (Sandbox Code Playgroud)