簡體   English   中英

java傳遞值原始vs對象

[英]java pass by value primitive vs objects

我已經閱讀了論壇並瀏覽了一些鏈接,發現Java全部都是通過值傳遞的,我認為我確實理解了引用是如何工作的,而不是原語是如何工作的。 據說,對於基元和對象,傳遞值以相同的方式工作。

我創建了一個示例程序

public class BirthDate {
int lear;
int year; // Instance variable
public static void main(String [] args) {
    BirthDate bd = new BirthDate();
    bd.lear=200;
    bd.year=300;
    int a=56;
    bd.showYear(a,bd);
    System.out.println(a);
    System.out.println(bd.lear);
}
public void showYear(int a, BirthDate bd) {
        a=59;
        System.out.println(bd.lear);
        bd.lear=400;
        System.out.println(bd.lear);
        System.out.println(a);
}

}

上述計划的產出為200 400 59 56 400

現在,如果在原語和引用的情況下傳遞了比特,那么為什么showYear方法中參考值的變化反映了原始bd對象的變化(值變為400)而不是原始數據類型iea

任何人都可以建議嗎?

您通過值傳遞BirthDate引用 ,因此您的方法引用與main方法中相同的 BirthDate

但是,然后您將該對象( lear )的成員從200更改為400。

因為您已經傳遞了對原始對象的引用,所以它沒有被復制,並且您始終在處理同一個對象。

當您傳遞BirthDate bd您正在傳遞對此對象的引用。

如果在您的表演年度,您將:

public void showYear(int a, BirthDate bd) {
        bd = new BirthdayDate();
}

這個bd = new BirthdayDate(); 相當於a= 59; 在大自然中。 這一點很重要。

你不會改變它之外的bd-你只是重新分配不同的參考。

不過你的:

bd.lear=400;

訪問此引用指向的對象並更改其值。 這樣您就可以編輯對象了。 這也可以看作只是一個原語的賦值 - 但它發生在bd指向的地方。

他們都是通過價值。 作為參考,對象引用按值傳遞。 當你說-

bd.showYear(a,bd);

您正在將bd的地址傳遞給showYear方法。 讓我們分解一下 -

BirthDate bd = new BirthDate(); // Let's say a new object bd is created at address 10.

我將參數bd更改為下面的bd2,所以我們不會將它誤認為是上面的Brithday bd

public void showYear(int a, BirthDate bd2) { // Parameter bd2 is pointing to address 10       

    bd2.lear=400; // bd2 followed the address 10 and changed bd's leap property. This doesn't change the fact that bd still is at address 10.
}

您可以在方法中更改引用所引用的Object的字段,但不能將其重新分配給另一個Object。 基元雖然是“不可變的”,但你不能在方法中改變它們的值。 這就是java參數在方法中的行為方式。

在這兩種情況下,您只傳遞價值。 U將Object ID的值傳遞給新的引用變量bd,在這種情況下是本地的。 所以,當你打電話

     bd.lear=400; 

它改變了Object的lear變量的值。 現在,當函數完成時,堆棧被破壞。 參考變量bd也是如此。 但由於主函數bd包含對象的id,因此對象不會被破壞。

來到原始類型,你改變了showYear函數的局部變量a的值

   a=59;

它打印它並用對象的堆棧銷毀。 但主要功能局部變量仍然存在,值為56。

成為Object的一部分,然后嘗試

  bd.a=59; 

你會看到價值在變化。 閱讀局部變量,實例變量和類變量..!

暫無
暫無

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

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