簡體   English   中英

用Java傳遞參數

[英]Parameter passing in Java

我知道Java總是按值傳遞,但我不明白為什么這樣可行:

public static void swap(int[] arr, int i, int j)
{
    int tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}
public static void main(String[] args)
{
    int[] arr = {3, 4, 5, 6};
    swap(arr, 1, 3);
    // arr becomes {3, 6, 5, 4}
}

這不起作用:

public static void swap(int[] arr, int[] arr2)
{
    int[] tmp = arr;
    arr = arr2;
    arr2 = tmp;
}
public static void main(String[] args)
{
   int[] arr = {3, 4, 5, 6};
   int[] arr2 = {1, 2, 5, 6};
   swap(arr, arr2);
}

為什么?

在第二種方法中,您嘗試交換引用,這將無效,因為引用本身是按值傳遞的。

第一種方法正常工作,因為它更改了數組引用的對象(這是可變的),它不會更改引用本身。

查看此博客文章 ,了解有關傳值和傳遞引用之間差異的更多詳細信息。

您的第一個示例是傳輸數組中的值。

第二個是你試圖交換引用(數組是Java中的對象)。 引用是本地副本(按值傳遞),並且對calee上下文沒有影響。

(問題#56.903關於按值調用; Stackexchange應該打開PassByValue.com ;-)

如果您曾經使用過C或C ++並且知道指針是如何工作的,那么讓整個方案為我做的是以下聲明:

In Java, everything is passed by value. 
In case of Objects, the reference (pointer) is passed by value.

所以基本上是交換功能

public void swap(int[] a, int[] b)
{
    etc.
}

只需獲取指向a int []數組的指針,以及指向b int []數組的指針。 你只需交換兩個指針。 你不能像這樣修改指針的內容。

基本上C等價物是

void swap(int* a, int* b)
{
   int* temp = a;
   a = b;
   b = temp;
}

int main(void)
{
    int a[] = {5,6,7,8};
    int b[] = {1,2,3,4};
    swap(a,b);
}

雖然在C中,這只會這樣工作:

void swap(int** a, int** b)
{
   int* temp = (*a);
   (*a) = (*b);
   (*b) = temp;
}

int main(void)
{
    int a[] = {5,6,7,8};
    int b[] = {1,2,3,4};
    swap(&a, &b);
}

當然,您無法在Java中發送引用的引用。 Java中不存在這種意義上的指針。

因此,為了在另一個函數中實際修改對象,您需要一個復制引用的“Holder”對象,但是它內部對您要修改的對象的引用實際上是對象的實際引用,如果這是有道理的。

因此,以下方法可行:

public class ArrayHolder
{
    public int[] array;

    public ArrayHolder(int[] array)
    {
        this.array = array;
    }
}

public void swap(ArrayHolder a, ArrayHolder b)
{
    int[] temp = a.array;
    a.array = b.array;
    b.array = temp;
}

public static void main(String[] args)
{
    ArrayHolder aaa = new ArrayHolder(new int[] {5,6,7,8});
    ArrayHolder bbb = new ArrayHolder(new int[] {1,2,3,4});
    swap(aaa,bbb);
}
  • 第一次交換你改變了數組的數據。 (由arr引用:引用)所以它被修改

  • 第二次交換 ,你改變了arr,arr2,兩個局部變量。 因此,當您退出該方法時,將銷毀這兩個新變量

  • Arrarr2是局部變量,因此在交換方法完成時它們將被銷毀。
  • 在外部交換方法中,局部變量的變化不會受到影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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