簡體   English   中英

Java傳遞數組和對象值

[英]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是“按引用傳遞”還是“按值傳遞”?

答案是不。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM