[英]Java Reference pass to methods
我有個問題。 我有下一個代碼示例:
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
以指向新的String
。 這對沒有影響String
即s
先前指向,並且具有該方法以外沒有影響change()
在第二種情況下
static void change(A a){
a.a = 10;
}
您正在修改引用a
指向的A
的實例,因此從方法返回時,此更改仍然存在。
Java 按值傳遞對象引用,因此您不會影響作為參數傳遞的對象。 這是您在第一個示例中看到的。
但是,您當然可以修改傳遞的對象的內容。 這是您在第二個示例中看到的。
在String的情況下,引用s
是本地副本,因此更改它不會執行任何操作。
在int
情況下,您使用的A
引用包含另一個字段。 更改該字段時,不會更改副本。
等效的是做類似a = new A();
在方法上也不會改變原來的。
在第一種情況下,方法change(String s)
正在修改原始引用的副本。
在第二種情況下,方法change(A a)
修改了引用所指向的變量,這是不相同的。 方法中使用的引用a
是副本,但不是它指向的變量aa
。
因此,在第一種情況下,當您change
s
時,您沒有得到實際的引用,但是得到的是引用的副本,因此分配新值不會影響舊值。
在第二種情況下,您傳遞了A
的實例,在這種情況下,您獲得了引用a
的副本,但您擁有該實例內部實際值的句柄。 作為a
持有一個int a
,當你改變的值int a
它影響的實際值。
為了澄清更多,在第二種情況下
change(A a){
a = new A();
a.a = 100;
}
它不會更改傳遞給main()
的原始a
Java是按值傳遞而不是按引用傳遞。 這意味着在方法
void changeVer1(Something val){
val = new Something("else");
}
val
是changeVer1
方法的局部變量,它是用作方法參數的引用的副本。 這意味着當你做
val = new Something("Else");
您正在更改此本地副本的值 ,因此不會更改用作此方法的參數的“原始”引用的值。
現在讓我們看看該方法的其他版本
void changeVer2(Something val){
val.someField = 42;
}
由於val
是您傳遞的引用的副本,因此它將保存與原始引用相同的對象,並且該對象狀態的每次更改都可以通過原始引用看到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.