黑马程序员技术交流社区

标题: 栈空间和堆空间 [打印本页]

作者: 郑强强    时间: 2012-4-7 18:57
标题: 栈空间和堆空间
class Person
{
        private int age;
        public void setAge(int a)
        {
                if(age>0&&a<130)
                    age=a;
                else
                        System.out.println("fei fa 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(20);
                p.speak();
                Person p1=new Person();
                //p.age=20;
                p1.setAge(20);
                p1.speak();

        }
}



对于这个程序,a赋值完成以后,空间会立即释放吗?那么p1是在a释空间以后重新创建一个栈内存空间吗?对于栈内存和堆的内存空间,这个程序
的具体释放顺序是什么呢??

作者: 宋蕈    时间: 2012-4-7 19:18
class Person
{
        private int age;
        public void setAge(int a)
        {
                if(age>0&&a<130)    // 问题1,这里setAge方法有点问题,age属性并没有得到赋值
                    age=a;      // 其次,你的a赋值完成之后,当然是等方法运行完才被释放在栈里的空间
                else
                        System.out.println("fei fa age");
        }
                                               
        public int getAge()
        {
                return age;
        }


        void speak()
        {
                System.out.println("age="+age);
        }
}

class  T_1
{
        public static void main(String[] args)
        {
                Person p=new Person();
                //p.age=20;
                p.setAge(20);
                p.speak();   
                Person p1=new Person();
                //p.age=20;
                p1.setAge(20);   
                p1.speak();    // 对于类对象的空间释放,java有自动垃圾回收机制的,当垃圾收集器判断已经没有任何引用指向对象的时候,会调用对象的finalize方法来释放对象占据的内存空间~
                                                                //java虚拟机应该是先将堆里的空间释放了再去处理掉栈里的空间

       }
}

作者: 刘_浩    时间: 2012-4-7 19:42
不会立即释放空间,p对象要在p.speak();运行后才会释放;然后再建立p1对象,后面的和p相同。对象名称当然是存在栈中的。
作者: τ、高童鞋ゝ    时间: 2012-4-7 21:18
p对象在运行p.speak()后释放,当一段代码定义一个变量以后,java在栈内存中为其分配空间,当超过了变量的作用域以后java会立即释放为其分配的空间在另作他用
堆内存是放new创建的对象和数组,在堆中非配的内存由java虚拟的自动垃圾回收机制(GC)自动回收,什么时候回收我就不知道了··
作者: 泽华老师    时间: 2012-4-7 23:27
栈空间是编译运行时会分配滴,在函数执行结束时这些存储单元自动被释放。
堆空间是new出来的空间,当这个内存空间的引用不存在的时候 会被垃圾回收器给回收.

p对象在运行p.speak()后释放 这句话是不对滴...
作者: 泽华老师    时间: 2012-4-7 23:29
栈空间是编译运行时会分配滴,在函数执行结束时这些存储单元自动被释放。
堆空间是new出来的空间,当这个内存空间的引用不存在的时候 会被垃圾回收器给回收.

p对象在运行p.speak()后释放 这句话是不对滴...
作者: pray    时间: 2014-4-26 04:26
我是来收集资料滴...




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