方法的Java引用传递

方法的Java引用传递,java,reference,Java,Reference,我有个问题。我有下一个代码示例: class Test{ static void change(String s){ s = "newString"; } public static void main(String args[]){ String s = "String"; change(s); System.out.print(s); } } 我看到结果是“字符串”。 现在我有以下代码: cla

我有个问题。我有下一个代码示例:

class Test{
    static void change(String s){
        s = "newString";
    }
    public static void main(String args[]){
        String s = "String";
        change(s);
        System.out.print(s);
    }
}
我看到结果是“字符串”。 现在我有以下代码:

class A{
    int a;
    static void change(A a){
       a.a = 10;
    }   
    public static void main(String[] args){
        A a = new A();
        a.a = 5;
        change(a);
        System.out.print(a.a);
    }
}

最后的值为10。我不明白为什么?他们不是都是推荐人吗?为什么第一个代码没有输出:“newString”?

这里的区别是在第一个示例中:

static void change(String s){
    s = "newString";
}
您可以重新分配局部变量
s
,以指向新的
字符串。这对先前指向的
s
字符串
没有影响,在方法
change()
之外也没有影响

在第二种情况下

static void change(A a){
   a.a = 10;
}  

您正在修改引用
A
所指向的
A
实例,因此当您从方法返回时,此更改仍然存在。

这里的区别在于第一个示例中:

static void change(String s){
    s = "newString";
}
您可以重新分配局部变量
s
,以指向新的
字符串。这对先前指向的
s
字符串
没有影响,在方法
change()
之外也没有影响

在第二种情况下

static void change(A a){
   a.a = 10;
}  

您正在修改引用
A
所指向的
A
的实例,因此当您从方法返回时,此更改仍然存在。

Java按值传递对象引用,因此您无法影响作为参数传递的对象。这是您在第一个示例中看到的


当然,您可以修改传递对象的内容。这是您在第二个示例中看到的。

Java通过值传递对象引用因此您无法影响作为参数传递的对象。这是您在第一个示例中看到的


当然,您可以修改传递对象的内容。这是您在第二个示例中看到的。

在字符串情况下,引用
s
是本地副本,因此更改它不会产生任何效果

int
案例中,您使用的是对
a
的引用,该引用包含另一个字段。更改该字段时,不会更改副本


等效的方法是做类似
a=newa()也不会更改原始值。

在字符串情况下,引用
s
是本地副本,因此更改它不会产生任何效果

int
案例中,您使用的是对
a
的引用,该引用包含另一个字段。更改该字段时,不会更改副本


等效的方法是做类似
a=newa()也不会更改原始引用。

在第一种情况下,方法
更改(字符串s)
正在修改原始引用的副本


在第二种情况下,方法
change(A)
是修改一个引用指向的变量,它是不同的。方法中使用的引用
a
是一个副本,但不是它指向的变量
a.a

在第一种情况下,方法
更改(字符串s)
正在修改原始引用的副本

在第二种情况下,方法
change(A)
是修改一个引用指向的变量,它是不同的。方法中使用的引用
a
是一个副本,但不是它所指向的变量
a.a

因此,在第一种情况下,当您在
change
中获得
s
时,您没有获得实际的引用,而是获得了引用的副本,因此分配一个新值不会影响旧值

在第二种情况下,您将传递一个
A
的实例,在这种情况下,您将获得引用
A
的副本,但您拥有该实例中实际值的句柄。作为保存int
a
a
,当您更改
int a
的值时,它会影响实际值

为了进一步澄清,在第二种情况下,如果你这样做了

change(A a){
   a = new A();
   a.a = 100;
}
它不会更改您传递给change from
main()

因此,在第一种情况下,当您在
change
中获得
s
时,您没有获得实际的引用,而是获得了引用的副本,因此分配一个新值不会影响旧值

在第二种情况下,您将传递一个
A
的实例,在这种情况下,您将获得引用
A
的副本,但您拥有该实例中实际值的句柄。作为保存int
a
a
,当您更改
int a
的值时,它会影响实际值

为了进一步澄清,在第二种情况下,如果你这样做了

change(A a){
   a = new A();
   a.a = 100;
}

它不会更改您传递到change from
main()

的原始
a
,Java是按值传递的,而不是按引用传递的。这意味着在方法上

void changeVer1(Something val){
    val = new Something("else");
}
val
changeVer1
方法的local变量,它是用作方法参数的引用的副本。这意味着当你这么做的时候

val = new Something("Else");
您正在更改此本地副本的值,因此这不会更改用作此方法参数的“原始”引用的值


现在让我们看看这个方法的其他版本

void changeVer2(Something val){
    val.someField = 42;
}

由于
val
是您传递的引用的副本,因此它将保存与原始引用相同的对象,并且此对象的状态的每个更改都将通过原始引用可见。

Java是按值传递的,而不是按引用传递的。这意味着在方法上

void changeVer1(Something val){
    val = new Something("else");
}
val
changeVer1
方法的local变量,它是用作方法参数的引用的副本。这意味着当你这么做的时候

val = new Something("Else");
您正在更改此本地副本的值,因此这不会更改用作此方法参数的“原始”引用的值


现在让我们看看这个方法的其他版本

void changeVer2(Something val){
    val.someField = 42;
}
因为
val
是您通过的参考文件的副本