new对象,对象保存在堆还是栈?
–>堆内存是用来存放由new创建的对象和数组,即动态申请的内存都存放在堆内存
–>栈内存是用来存放在函数中定义的一些基本类型的变量和对象的引用变量
举个例子
void func()
{
Object obj = new Object();//这个obj在函数的栈里。
}
class Test
{
private Object obj = new Object();//这个obj随对应的Test对象分配在堆里
}
根据程序来了解内存的存放
- 程序的介绍,创建两个类,Phone(包含 name,price,color, call(), sendMsg(), playGame()), PhoneTest 会创建Phone类并且对函数操作
程序开始执行
- 创建main函数之前,会编译Phone,PhoneTest 为class文件,存放到方法区,其中PhoneTest.class包含main(), Phone.class 包含成员变量,还有成员方法,成员方法总的地址为0x0001
- 先执行public static void main, 把main()存放到栈区
- 执行Phone p1=new Phone(); 左边p1是引用,存放到栈区, new Phone() 为new 对象,存放到堆区,地址为0x001,p1指向0x001
- sop()打印当前的默认值
- 为p1的成员变量赋值,在堆内存中,成员变量的值发生改变
- sop()又打印最新的成员变量的值
- p1调用方法的时候,在栈区会为方法开辟空间,当方法调用结束,就释放内存
- 当main()执行结束,栈释放内存