[英]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,兩個局部變量。 因此,當您退出該方法時,將銷毀這兩個新變量
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.