[英]Java Passing array and object value
public static void main(String[] args) {
Foo[] foo1 = new Foo[1];
Foo[] foo2 = new Foo[1];
foo1[0] = new Foo();
foo2[0] = new Foo();
foo1[0].x = 1;
foo2[0].x = 2;
swapA(foo1, foo2);
System.out.println("Swap A " + foo1[0].x + " " + foo2[0].x);
swapB(foo1[0], foo2[0]);
System.out.println("Swap B " + foo1[0].x + " " + foo2[0].x);
swapC(foo1[0], foo2[0]);
System.out.println("Swap C " + foo1[0].x + " " + foo2[0].x);
swapD(foo1, foo2);
System.out.println("Swap D " + foo1[0].x + " " + foo2[0].x);
}
public static void swapA(Foo[] o1, Foo[] o2) {
Foo[] temp;
temp = o1;
o1 = o2;
o2 = temp;
System.out.println("Swap A " + o1[0].x + " " + o2[0].x);
}
public static void swapD(Foo[] o1, Foo[] o2) {
Foo temp;
temp = o1[0];
o1[0] = o2[0];
o2[0] = temp;
System.out.println("Swap D " + o1[0].x + " " + o2[0].x);
}
public static void swapB(Foo o1, Foo o2) {
Foo temp;
temp = o1;
o1 = o2;
o2 = temp;
System.out.println("Swap B " + o1.x + " " + o2.x);
}
public static void swapC(Foo o1, Foo o2) {
int temp;
temp = o1.x;
o1.x = o2.x;
o2.x = temp;
System.out.println("Swap C " + o1.x + " " + o2.x);
}
Swap A 2 1
Swap A 1 2
Swap B 2 1
Swap B 1 2
Swap C 2 1
Swap C 2 1
Swap D 1 2
Swap D 1 2
只是想有一個更好的理解,為什么在main方法中打印時swapA和swapB為什么不更改值,而通過方法本身可以更改值。 我以為對象和數組在交換時是通過引用傳遞的,所以原始值也會改變嗎?
答案是不。 Java是按值傳遞引用。
例如:
String a = "a string";
public void change(String b) {
b = "some other string";
}
change(a);
變量a的“指針”按值傳遞,並在方法范圍內分配給b。 更改b會更改b,但不會更改a。
JAVA始終可以通過價值傳遞!!!
Java引用按值傳遞。
按引用傳遞/按值傳遞是一個非常煩人的術語。
hvgotcodes回答“引用按值傳遞”是最明顯的證明。
Java是一致的,只記得兩件事:
1)您始終可以重新分配傳遞給任何方法的變量,而不會影響調用方。
2)Java不會復制對象,因此如果您將給定的實例傳遞給您,則修改該實例中的數據將為每個人修改它。
順便說一句,我看到的唯一一種修改傳入的值的情況是“交換”,這是人為的,因為編寫通用版本很簡單,沒有意義。
通常,修改傳遞給方法的值非常罕見,而且令人困惑,以至於Java決定您不需要它。 並非每個人都認為這是一個不錯的決定,但是您可能會認為通過引用傳遞是好事還是必須承認,沒有引用將使您忘記一系列顧慮(調用方法時,您的變量將永遠不會被修改) )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.