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在调用,所以未报空指针异常