Java虛拟機是通過某些資料類型來執行計算的,資料類型可以分為兩種:基本類型和引用類型,基本類型的變量持有原始值,而引用類型的變量持有引用值。

Java語言中的所有基本類型同樣也都是Java虛拟機中的基本類型。但是boolean有點特别,雖然Java虛拟機也把boolean看做基本類型,但是指令集對boolean隻有很有限的支援,當編譯器把Java源代碼編譯為位元組碼時,它會用int或者byte來表示boolean。在Java虛拟機中,false是由整數零來表示的,所有非零整數都表示true,涉及boolean值的操作則會使用int。另外,boolean數組是當做byte數組來通路的,但是在“堆”區,它也可以被表示為位域。
Java虛拟機還有一個隻在内部使用的基本類型:returnAddress,Java程式員不能使用這個類型,這個基本類型被用來實作Java程式中的finally子句。該類型是jsr, ret以及jsr_w指令需要使用到的,它的值是JVM指令的操作碼的指針。returnAddress類型不是簡單意義上的數值,不屬于任何一種基本類型,并且它的值是不能被運作中的程式所修改的。
Java虛拟機的引用類型被統稱為“引用(reference)”,有三種引用類型:類類型、接口類型、以及數組類型,它們的值都是對動态建立對象的引用。類類型的值是對類執行個體的引用;數組類型的值是對數組對象的引用,在Java虛拟機中,數組是個真正的對象;而接口類型的值,則是對實作了該接口的某個類執行個體的引用。還有一種特殊的引用值是null,它表示該引用變量沒有引用任何對象。
“當一個對象被當作參數傳遞到一個方法”,這就是所謂的按引用傳遞。
上面代碼的輸出結果是“hello world”,這不必多說,那如果将set方法改為如下,結果會是多少呢?
答案依然是“hello world”,下面就讓我們來分析一下如上代碼。
首先
是在堆中建立了一個對象,并在棧中建立了一個引用,此引用指向該對象,如下圖:
是将引用user作為參數傳遞到set方法,注意:這裡傳遞的并不是引用本身,而是一個引用的拷貝。也就是說這時有兩個引用(引用和引用的拷貝)同時指向堆中的對象,如下圖:
在set()方法中,“user引用的拷貝”操作堆中的User對象,給name屬性設定字元串"hello world"。如下圖:
在set()方法中,又建立了一個User對象,并将“user引用的拷貝”指向這個在堆中新建立的對象,如下圖:
在set()方法中,“user引用的拷貝”操作的是堆中新建立的User對象。
set()方法執行完畢,目光再回到mian()方法
因為之前,"user引用的拷貝"已經将堆中的User對象的name屬性設定為了"hello world",是以當main()方法中的user調用getName()時,列印的結果就是"hello world"。如下圖: