黑马程序员技术交流社区

标题: 栈内存中定义的变量可以赋值给堆内存的? [打印本页]

作者: 8047107    时间: 2013-5-15 18:59
标题: 栈内存中定义的变量可以赋值给堆内存的?
本帖最后由 8047107 于 2013-5-18 11:52 编辑

代码如下
  1. /*
  2. private :私有,权限修饰符:用于修饰类中的成员(成员变量,成员函数)。
  3. 私有只在本类中有效。

  4. 将age私有化以后,类以外即使建立了对象也不能直接访问。
  5. 但是人应该有年龄,就需要在Person类中提供对应访问age的方式。

  6. 注意:私有仅仅是封装的一种表现形式。


  7. 之所以对外提供访问方式,就因为可以在访问方式中加入逻辑判断等语句。
  8. 对访问的数据进行操作。提高代码健壮性。

  9. */

  10. class Person
  11. {
  12.         private int age;
  13.         public void setAge(int a)
  14.         {
  15.                 if(a>0 && a<130)
  16.                 {
  17.                         age = a;
  18.                         speak();
  19.                 }
  20.                 else
  21.                         System.out.println("feifa age");
  22.         }

  23.         public int getAge()
  24.         {
  25.                 return age;
  26.         }
  27.         private void speak()
  28.         {
  29.                 System.out.println("age="+age);
  30.         }
  31. }

  32. class PersonDemo
  33. {
  34.         public static void  main(String[] args)
  35.         {
  36.                 Person p = new Person();

  37.                 //p.age = -20;
  38.                 p.setAge(-40);
  39.                 //p.speak();
  40.         }
  41. }
复制代码
代码本身是没有什么问题的,讲到后来,有同学说是a指向堆内存的对象,老师说不是,a不是引用数据类型,a和对象没有关系,a只是把值赋给对象的age。但是我在想,栈内存中的数可以赋给堆内存吗?两个内存区不是分开的吗? (虽然我知道a和对象没有关系。。只是一个疑问)

作者: 赖波    时间: 2013-5-15 19:46
本帖最后由 赖波 于 2013-5-15 19:55 编辑

基本数据类型也分情况,成员变量和所属的对象同在堆区,局部变量的话就分配在栈区,用完就消失了,
对于new出来的对象就分配在堆区,我也有可能不准确,我错的请指出。{:soso_e120:}
作者: slatop@qq.com    时间: 2013-5-15 22:30
你的问题我有点没看明白。
  不过我可以告诉你栈内存中的数据是可以赋给堆中数据的。
  其实对于初学者来说,在JAVA里没必要去对堆栈问题研究的太深刻。因为JAVA本身屏蔽指针功能,加上有垃圾回收机制。在JAVA中栈和堆的数据差别不大。
  栈与堆真正的意义和你说一下。栈是一个临时空间由系统存放临时数据用的地方一般电脑的栈空间在2M左右(win32系统下,其它系统我没研究过。)
  栈内存是一个有序的排列空间,系统管理起来很方便,查询增删数据都比较快,至于它是怎么操作栈的,这个我们就没必要了解了。是windows内核对象的事。
  堆内存包括两部分,一部分是物理内存,一部分是虚拟内存。在编程中堆内存的主要特征是容量大,可以由程序员自由分配和删除。但是在JAVA中由于考虑到指针的复杂性和容错率将指针屏蔽了。虽然这样安全性高,但是对堆内存的操作性大大的降低。
  堆内存空间是无法用变量记录的,只能用指针记录,在JAVA中将这个指针改为了引用,引用实事上就是一个常量指针,是变量的别名。操作用法完全和变量相同。所以变象的在JAVA中堆与栈的差别不大。因为即使你想将一个对象开在栈中在JAVA中你都没办法实现。强制的要求你对象必须开在堆中,既然是强制的,你去了解他有何用。
  JAVA本身提倡的就是内部内存管理,程序员可以干涉的内存管理本来就很少。你只须要大概了解一下就行,想深究的话可以看一下C++的堆内存管理,或是汇编的内存管理分配
作者: 8047107    时间: 2013-5-15 22:33
赖波 发表于 2013-5-15 19:46
基本数据类型也分情况,成员变量和所属的对象同在堆区,局部变量的话就分配在栈区,用完就消失了,
对于new ...

嗯 你说的都是对的。我只是不知道栈内存可以直接赋给堆内存 我以为都是单独分开的
作者: 孤独的鸟人    时间: 2013-5-15 22:39
栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。
堆内存一般用于存放不放在当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,它们不需要程序代码来显式的释放。堆是由Java的垃圾收集器自动收走不再使用的数据。
当你new一个对象时,会在堆内存中分配内存空间;当调用方法时,此时向对象age赋值时是值传递,即将a的值传递给age,所以栈内存中的数可以赋给堆内存的对象。
作者: 赖波    时间: 2013-5-16 08:13
8047107 发表于 2013-5-15 22:33
嗯 你说的都是对的。我只是不知道栈内存可以直接赋给堆内存 我以为都是单独分开的 ...

p.age=20; 中的“=”就是个赋值符啊,你想得有点远。
作者: 袁梦希    时间: 2013-5-16 11:51
楼主你好   如果帖子已经解决  请把帖子的类型改为“已解决”。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2