簡體   English   中英

Java參考傳遞給方法

[英]Java Reference pass to methods

我有個問題。 我有下一個代碼示例:

class Test{
    static void change(String s){
        s = "newString";
    }
    public static void main(String args[]){
        String s = "String";
        change(s);
        System.out.print(s);
    }
}

我看到結果是“字符串”。 現在我有以下代碼:

class A{
    int a;
    static void change(A a){
       a.a = 10;
    }   
    public static void main(String[] args){
        A a = new A();
        a.a = 5;
        change(a);
        System.out.print(a.a);
    }
}

最終得到的值為10。我不明白為什么? 他們不是都引用嗎? 為什么第一個代碼輸出不是:“ newString”?

此處的區別在於第一個示例:

static void change(String s){
    s = "newString";
}

您可以重新分配局部變量s以指向新的String 這對沒有影響Strings先前指向,並且具有該方法以外沒有影響change()

在第二種情況下

static void change(A a){
   a.a = 10;
}  

您正在修改引用a指向的A的實例,因此從方法返回時,此更改仍然存在。

Java 按值傳遞對象引用因此您不會影響作為參數傳遞的對象。 這是您在第一個示例中看到的。

但是,您當然可以修改傳遞的對象的內容。 這是您在第二個示例中看到的。

在String的情況下,引用s是本地副本,因此更改它不會執行任何操作。

int情況下,您使用的A引用包含另一個字段。 更改該字段時,不會更改副本。

等效的是做類似a = new A(); 在方法上也不會改變原來的。

在第一種情況下,方法change(String s)正在修改原始引用的副本。

在第二種情況下,方法change(A a)修改了引用所指向的變量,這是不相同的。 方法中使用的引用a是副本,但不是它指向的變量aa

Java是價值傳遞

因此,在第一種情況下,當您change s時,您沒有得到實際的引用,但是得到的是引用的副本,因此分配新值不會影響舊值。

在第二種情況下,您傳遞了A的實例,在這種情況下,您獲得了引用a的副本,但您擁有該實例內部實際值的句柄。 作為a持有一個int a ,當你改變的值int a它影響的實際值。

為了澄清更多,在第二種情況下

change(A a){
   a = new A();
   a.a = 100;
}

它不會更改傳遞給main()的原始a

Java是按值傳遞而不是按引用傳遞。 這意味着在方法

void changeVer1(Something val){
    val = new Something("else");
}

valchangeVer1方法的局部變量,它是用作方法參數的引用的副本。 這意味着當你做

val = new Something("Else");

您正在更改此本地副本的 ,因此不會更改用作此方法的參數的“原始”引用的值。


現在讓我們看看該方法的其他版本

void changeVer2(Something val){
    val.someField = 42;
}

由於val是您傳遞的引用的副本,因此它將保存與原始引用相同的對象,並且該對象狀態的每次更改都可以通過原始引用看到。

暫無
暫無

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

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