簡體   English   中英

無法找到此Java代碼的輸出

[英]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.

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