1. 程式人生 > >為什麼Dog物件不報空指標

為什麼Dog物件不報空指標

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.封裝型別(引用物件型別)中,物件放在堆裡,物件的引用放在棧裡。

封裝型別的傳遞

  1. 虛擬機器在堆中開闢了一個Dog的記憶體空間,new出來的物件Dog存在堆裡面
  2. 虛擬機器在棧中分配給Dog一個記憶體地址p,這個地址值指向Dog的堆記憶體
  3. 虛擬機器複製了一個p,我們叫他p#,p和p#的記憶體地址不同,指向值是同一個Dog堆記憶體
  4. 將p#傳入dogToNull方法,p#設定為 null 只是棧中指向的引用為 null,但new 出來的物件Dog還是存在於堆裡面的
  5. eat方法執行以後,實際是p在呼叫,所以未報