A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 但汉涛 中级黑马   /  2012-12-7 12:10  /  1490 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 但汉涛 于 2012-12-7 19:57 编辑
  1. class Person
  2. {
  3.         private int age;
  4.         public void setAge(int a)
  5.         {
  6.                 if(a>0&&a<30)
  7.                 {
  8.                 age = a;
  9.                 speak();
  10.                 }
  11.                 else
  12.                         System.out.println("非法:age")
  13.         }
  14.         public int getAge()
  15.         {
  16.                 return age;
  17.         }
  18.         void speak()
  19.         {
  20.                 System.out.println("age="+age);
  21.         }
  22. }

  23. class PersonDemo
  24. {
  25.         public static void main(String[] args)
  26.         {
  27.                 Person p =new Person();
  28.                 //p.age=-20;
  29.                 p.setAge(40);
  30.         }
  31. }
复制代码
对于堆内存和栈内存,理解不是很深刻。
是不是可以理解为:局部变量都是在堆内存中。
只要用到关键字new,那么变量就会存储到栈内存中呢?
Person p =new Person();这个视频中中说,在堆内存中建立一个类p,存储一个栈内存的地址,同时在堆内存建立一个对象。
p.setAge(40);这个我理解不了,p.setAge()不是成员函数呢,应该在栈内存中的。
为什么要在堆内存中先建一个setAge(), a=40呢?

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
本帖最后由 马志军 于 2012-12-7 13:41 编辑

1.一般的局部变量应该是定义在栈内存。比如一个方法里面int x=0了,在方法外面这个变量x就不能用了,栈里的东西用完就自动释放掉了。
2.用到关键字new的,都是存到堆内存的,你可能是看倒了,视频再看一遍。
3.Person p =new Person();栈里有个p,是个引用类型值,它指向堆内存的对象,我感觉有点像是C中的指针。对象本身是存在堆中的,而栈里的p指着那对象,相当于那个对象的一个名字,你要操作对象,总得有个名字,才好去操作。
4.p.setAge()不在栈内存。静态方法在方法区中。原来对于非静态方法在哪里我也不太清楚,刚搜到个帖子说非静态方法也是放在方法区,类中有的是一个引用。
我也是初学者,仅供参考讨论

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
楼上正解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马