為什麼Dog物件不報空指標
阿新 • • 發佈:2019-09-18
public class Test { public static void main(String[] args) { Dog dog = new Dog(); new Change().dogToNull(dog); dog.eat(); } } class Dog { String food = "bone"; void eat() { System.out.println(food); } void add(String food) { this.food = food; } } class Change { void dogToNull(Dog dog) { dog = null; } }
列印結果
bone
問題
為什麼Dog物件不報空指標?
知識要點:
1.java在方法傳遞引數時,是將變數複製一份,然後傳入方法體去執行
2.基本型別的變數放在棧裡;
3.封裝型別(引用物件型別)中,物件放在堆裡,物件的引用放在棧裡。
封裝型別的傳遞
- 虛擬機器在堆中開闢了一個Dog的記憶體空間,new出來的物件Dog存在堆裡面
- 虛擬機器在棧中分配給Dog一個記憶體地址p,這個地址值指向Dog的堆記憶體
- 虛擬機器複製了一個p,我們叫他p#,p和p#的記憶體地址不同,指向值是同一個Dog堆記憶體
- 將p#傳入dogToNull方法,p#設定為 null 只是棧中指向的引用為 null,但new 出來的物件Dog還是存在於堆裡面的
- eat方法執行以後,實際是p在呼叫,所以未報