![](/img/trans.png)
[英]Java methods isbn char conversion and output problems. Can't find out mistake in algorithm
[英]Can't find out with output of this java code
誰能向我解釋為什么這段代碼的輸出如下?
0 40
0 40
public class Class extends Main {
public static void main(String[] args) {
int x = 0;
int [] arr = {20};
f (x, arr);
System.out.println(x + " " + arr[0]);
g (x, arr);
System.out.println(x + " " + arr[0]);
}
public static void f(int x, int[] arr) {
x += 30;
arr[0] = 40;
}
public static void g(int x, int[] arr) {
x = 50;
arr = new int[] {60};
}
}
我認為應該是這樣的:
0 20
0 20
數組是一個對象,因此當您將其傳遞給方法時,您將傳遞對該對象的引用。 因此,方法調用可以更改數組中的元素,並且更改后的數組與傳遞給方法的數組相同。 因此, f()
的調用者可以看到這些變化。
另一方面,當您將原始值傳遞給方法時,將創建變量的副本,並且該方法所做的任何更改都屬於該方法的范圍。 當該方法接收到一個包含對象引用的變量並嘗試為其分配新引用時,也是如此。 該分配是該方法的本地方法。 這就是為什么g()
不會更改傳遞給它的數組的原因。
因此,在調用f()方法期間, 您將數組對象引用作為值傳遞給f方法 ,因此您可以訪問a [0],並且可以將其更改為您正在執行的任何值,因此你得到30。
現在,當您調用g()方法時,您確實再次將數組對象的引用作為值傳遞,並且在內部嘗試將新實例分配給array,這是完全有效的,並且您會在該方法中看到期望的更改,但是當您返回main時,您會看到相同的舊引用(請記住,我們將引用作為值而不是原始對象的引用傳遞),因此最終將舊40視為值。
在Java中,數組是一個對象,對象通過引用傳遞,因此當您在方法中對數組進行更改時,它也會影響實際的數組
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.