簡體   English   中英

Java中傳遞的參數

[英]Parameters passing in Java

我在一個類中有一個Long對象,給它一個值,然后將其傳遞給另一個類的構造函數,在該構造函數中對其進行更改。 為什么更改在第一個對象中不可見?

編碼:

public class ClassA {
    private Long t;

    public ClassA() {
        t = new Long(10);
        System.out.println(t); // prints 10
        new ClassB(t); // it is modified (see ClassB)
        System.out.println(t); // prints 10 again
    }

    public static void main(String[] args) {
        new ClassA();
    }
}

class ClassB {
    private Long p;

    public ClassB(Long p) {
        this.p = p;
        this.p = this.p + 1;
        System.out.println(this.p); // prints 11
    }
}

輸出為:10 11 10 Long變量在ClassA中初始化。 然后,將其傳遞給ClassB,對其進行修改,並且顯然在第一堂課中看不到更改。 為什么?

這是因為Long類是不可變的。 創建實例后,就永遠無法更改。

在這一行:

this.p = this.p + 1;

您正在做的是創建一個新的 Long對象。 不可變類的其他示例包括原始數字類型( ByteShort等)和String所有“包裝”類。

無濟於事的是,它使+運算符不直觀。 真正沒有幫助的是,該語言允許在所有這些不可變的類上使用+

上一行發生的情況可以寫成(盡管我懷疑字節碼中發生的情況有所不同):

long tmp = this.p.longValue();
tmp += 1;
this.p = new Long(tmp);

您還可以通過在B類中將p標記為final來驗證不變性,這意味着引用 p永遠不會改變; 由於您嘗試修改引用p this.p = this.p + 1會引發編譯錯誤。

這行this.p = this.p + 1; 不會修改p,而是通過將兩個值p1相加來創建一個新的Long ,然后將this.p設置為對此新Long的引用。 類的對象Long沒有突變的方法,使他們能夠永遠不會改變(B類中this.p沒有改變, this.p成為了一個新的龍的引用)

所以行為實際上是

this.p=p;
Long newLong=this.p + 1;
this.p=newLong;

你在想的是

this.p=p
this.p.imaginaryAddLocal(1);

這會影響原始的p,但是當然不存在這種方法imaginaryAllLocal ,因為Long類的對象是不可變的

首先, Long是不可變的。 這意味着您無法更改在構造函數中設置的值(請注意,沒有set方法)。

當你做

this.p = this.p + 1;

Java。

1)自動將this.p轉換為其長值(原始)

2)算術運算

3)將結果自動轉換回新的不同的Long並將引用分配給this.p

t一直一直指向原始的Long對象。

在Java中,您可以通過對象的屬性(不建議使用,應將它們設置為private )或其方法來修改對象。 + (或其他運算符)將永遠不會更改對象狀態(盡管可能會創建一個新的對象狀態,僅在myString1 + myString2情況下)

1-您只是在修改B類的p成員
2-Java中的所有內容都按值(而不是引用)傳遞

Long類是不可變的,因此您不能通過在調用的函數中對其進行修改來傳回該值。 在您的ClassB ,將創建一個副本,並且原始值永遠不會更改。

如果希望呼叫者看到更改的值,則必須將其作為返回值傳遞回去。

其他原始包裝器和String也是如此。

因為Java使用傳遞引用。 這意味着它將傳遞變量的副本 ,而不是對“原始”變量的引用。

例如,在C ++中,您可以執行以下操作:

void change_var(int &x)
{
    x = 2;
}

int x = 10;
change_var(x);
std::cout << x << std::endl;

由於將傳遞對變量x的引用,而不是副本,因此將打印2

暫無
暫無

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

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