黑马程序员技术交流社区
标题:
堆内存和栈内存的问题
[打印本页]
作者:
但汉涛
时间:
2012-12-7 12:10
标题:
堆内存和栈内存的问题
本帖最后由 但汉涛 于 2012-12-7 19:57 编辑
class Person
{
private int age;
public void setAge(int a)
{
if(a>0&&a<30)
{
age = a;
speak();
}
else
System.out.println("非法:age")
}
public int getAge()
{
return age;
}
void speak()
{
System.out.println("age="+age);
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p =new Person();
//p.age=-20;
p.setAge(40);
}
}
复制代码
对于堆内存和栈内存,理解不是很深刻。
是不是可以理解为:局部变量都是在堆内存中。
只要用到关键字new,那么变量就会存储到栈内存中呢?
Person p =new Person();这个视频中中说,在堆内存中建立一个类p,存储一个栈内存的地址,同时在堆内存建立一个对象。
p.setAge(40);这个我理解不了,p.setAge()不是成员函数呢,应该在栈内存中的。
为什么要在堆内存中先建一个setAge(), a=40呢?
作者:
马志军
时间:
2012-12-7 13:19
本帖最后由 马志军 于 2012-12-7 13:41 编辑
1.一般的局部变量应该是定义在栈内存。比如一个方法里面int x=0了,在方法外面这个变量x就不能用了,栈里的东西用完就自动释放掉了。
2.用到关键字new的,都是存到堆内存的,你可能是看倒了,视频再看一遍。
3.Person p =new Person();栈里有个p,是个引用类型值,它指向堆内存的对象,我感觉有点像是C中的指针。对象本身是存在堆中的,而栈里的p指着那对象,相当于那个对象的一个名字,你要操作对象,总得有个名字,才好去操作。
4.p.setAge()不在栈内存。静态方法在方法区中。原来对于非静态方法在哪里我也不太清楚,刚搜到个帖子说非静态方法也是放在方法区,类中有的是一个引用。
我也是初学者,仅供参考讨论
作者:
郑雅杰
时间:
2012-12-7 13:30
楼上正解
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2