Java程序的多个部分(方法,变量,对象)驻留在内存中以下两个位置:即堆和栈,现在我们只关心三类事物:实例变量,局部变量和对象:
实例变量和对象驻留在堆上
局部变量驻留在栈上
让我们查看一个 java 程序,看看他的各部分如何创建并且映射到栈和堆中:
public class Dog {
Collar c;
String name;
//1.main()方法位于栈上
public static void main(String[] args) {
//2.在栈上创建引用变量d,但Dog对象尚未存在
Dog d;
//3.创建新的Dog对象,并将其赋予d引用变量
d = new Dog();
//4.将引用变量的一个副本传递给go()方法
d.go(d);
}
//5.将go()方法置于栈上,并将dog参数作为局部变量
void go(Dog dog){
//6.在堆上创建新的Collar对象,并将其赋予Dog的实例变量
c = new Collar();
}
//7.将setName()添加到栈上,并将dogName参数作为其局部变量
void setName(String dogName){
//8.name的实例对象也引用String对象
name =dogName;
}
//9.程序执行完成后,setName()将会完成并从栈中清除,此时,局部变量dogName也会消失,尽管它所引用的String仍在堆上
}