方法的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()方法中的code>也不会更改原始值。在字符串情况下,引用s
是本地副本,因此更改它不会产生任何效果
在int
案例中,您使用的是对a
的引用,该引用包含另一个字段。更改该字段时,不会更改副本
等效的方法是做类似a=newa()方法中的code>也不会更改原始引用。在第一种情况下,方法更改(字符串s)
正在修改原始引用的副本
在第二种情况下,方法change(A)
是修改一个引用指向的变量,它是不同的。方法中使用的引用a
是一个副本,但不是它指向的变量a.a
。在第一种情况下,方法更改(字符串s)
正在修改原始引用的副本
在第二种情况下,方法change(A)
是修改一个引用指向的变量,它是不同的。方法中使用的引用a
是一个副本,但不是它所指向的变量a.a
因此,在第一种情况下,当您在change
中获得s
时,您没有获得实际的引用,而是获得了引用的副本,因此分配一个新值不会影响旧值
在第二种情况下,您将传递一个A
的实例,在这种情况下,您将获得引用A
的副本,但您拥有该实例中实际值的句柄。作为保存inta
的a
,当您更改int a
的值时,它会影响实际值
为了进一步澄清,在第二种情况下,如果你这样做了
change(A a){
a = new A();
a.a = 100;
}
它不会更改您传递给change frommain()
因此,在第一种情况下,当您在change
中获得s
时,您没有获得实际的引用,而是获得了引用的副本,因此分配一个新值不会影响旧值
在第二种情况下,您将传递一个A
的实例,在这种情况下,您将获得引用A
的副本,但您拥有该实例中实际值的句柄。作为保存inta
的a
,当您更改int a
的值时,它会影响实际值
为了进一步澄清,在第二种情况下,如果你这样做了
change(A a){
a = new A();
a.a = 100;
}
它不会更改您传递到change frommain()
的原始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
是您通过的参考文件的副本