2014-07-02 72 views
2

據我瞭解,如果我寫當我在java中創建對象時,jvm究竟發生了什麼?

Car a3=new Car() 

該語句將創建一個與它在JVM堆中的所有屬性JVM堆命名a3手柄。 如果這是正確的,我想知道價值如何調用。 所以,如果我創建一個方法checkMethod(Car c)並說checkMethod(a3); 假設我們的車叫它是

public class Car{ 
    int a=0; 
    public int getpar(){ 
     return a; 
    } 
} 
checkMethod

我嘗試訪問using a3.a = 5;,所以我改變了a3.a 值,它會顯示我的主叫類以及它指向jvm在堆中創建的相同字段。

但是,當我在調用方法中做a3= null;並再次返回時,我打電話給 checkMethod(a3)並試圖看到這個對象它不是null? 爲什麼它的表現與對象屬性相比是不同的?

+1

想象A3(和所有變量)爲與對他們寫的地址的紙片。當你將一個變量傳遞給一個方法時,你將**地址**複製到一張新紙上(bacuse java是按值傳遞的)。當您將該方法內的變量設置爲空時,您可以在紙上寫出地址。但原來的遺蹟 –

+0

謝謝!這是有道理的。 – piyush

回答

1
checkMethod(a3); 

傳遞一個值是反對汽車的實例

裏面方法...

a3.a = 5 

使用A3參考的複製,修改這是由識別汽車的對象實例a3(這是原始a3的副本)。

a3 = null 

設置基準爲null(複印件)

發生這種情況時,只有副本,你傳遞給你的方法將指向空。但原來的a3仍然指向你的Car對象實例。

1

Why it behaved differently as compared to property of object that is a?

由於Java是(純)call by value。您無法操作被調用上下文中的參數值。您始終在調用上下文中獲取本地副本。

0

在方法調用上,Java傳遞引用的副本。

所以當將a3設置爲null時,它只會將其引用的副本設置爲null,並將其他副本存儲在其他位置。

0

整個訣竅是這樣的:Java的傳遞引用通過 :)

相關問題