2017-09-11 55 views
0

正如我在線閱讀的,Java是通過值傳遞的,一般的交換函數不會交換這兩個值。我也讀過,不可能交換原始類型的值。我想知道爲什麼下面的程序工作並在交換後顯示不同的valies?通過程序瞭解java中的swap函數

public class swapMe { 

    public static void main(String[] args) { 
     int x = 10 , y = 20; 

     System.out.println("Before"); 
     System.out.println("First number = " + x); 
     System.out.println("Second number = " + y); 

     int temp = x; 
     x = y; 
     y = temp; 

     System.out.println("After"); 
     System.out.println("First number = " + x); 
     System.out.println("Second number = " + y); 
    } 
} 

是它喜歡的地方,的x = 10原始值和y = 20仍在某處存儲和顯示的交換值不正確?請指教。謝謝

+2

(捂臉!)你們這些值傳遞到任何方法,以檢查***交換功能將不會掉***理論??? –

+0

在執行'int temp = x;'之後,存儲在'temp'中的'x'的值。等等。他們不是「某個地方」,你自己告訴編譯器他們應該在哪裏。 –

+0

您需要理解字面**交換**和交換變量之間的+賦值的區別。另外 - 「*因爲我在網上讀到Java是通過值傳遞的*」您從未將任何變量傳遞給示例中的任何方法 – Fureeish

回答

3

不是完全確定你在哪裏得到這些信息,但讓我們一次採取這一個。

正如我在網上閱讀的那樣,Java是按值傳遞的,一般的交換函數不會交換這兩個值。

正確 ...如果通過調用方法來實現交換的期望。

public void swap(int x, int y) { 
    int tmp = x; 
    x = y; 
    y = tmp; 
} 

// meanwhile, in main 
int x = 10; 
int y = 20; 
swap(x, y); 
System.out.println(x); // still prints 10 
System.out.println(y); // still prints 20 

不正確 ...如果交換髮生內部的方法和以某種方式利用。

public void swap(int x, int y) { 
    int tmp = x; 
    x = y; 
    y = tmp; 
    System.out.println(x); // will print 20 from main 
    System.out.println(y); // will print 10 from main 
} 

// meanwhile, in main 
int x = 10; 
int y = 20; 
swap(x, y); 
System.out.println(x); // still prints 10 
System.out.println(y); // still prints 20 

我也看了,它是不可能的交換原始類型的值。

不,這是完全可以做到的。您始終可以重新分配變量。

至於你上面的例子爲什麼起作用,這是因爲當你重新指定其中一個變量時,你正在保持其中一個值。當你複製它時,你基本上把一個價值放在一邊。

慢慢...

int x = 10; 
int y = 20; 
int tmp = x; // tmp = 10 
x = y; // x = 20, tmp = 10 
y = tmp; x = 20, y = 10; tmp = 10 (but that doesn't matter) 
+0

您在技術上不能在基元之間「交換」值:「4」將保留「4」你用它做。 OP只是混淆了交換和分配。 –

+0

@ M.Prokhorov:它不像Python中那樣不需要中間變量的交換方式,但是當在這種情況下使用時,重新分配是一致的。 – Makoto

+0

我很確定Python也使用第三個變量,它只是不會顯示給你。 –