为什么Dog对象不报空指针

半腔热情 提交于 2019-11-29 21:45:29
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在调用,所以未报空指针异常
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!