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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑强强 中级黑马   /  2012-4-7 18:57  /  2913 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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释空间以后重新创建一个栈内存空间吗?对于栈内存和堆的内存空间,这个程序
的具体释放顺序是什么呢??

6 个回复

倒序浏览
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虚拟机应该是先将堆里的空间释放了再去处理掉栈里的空间

       }
}
回复 使用道具 举报
不会立即释放空间,p对象要在p.speak();运行后才会释放;然后再建立p1对象,后面的和p相同。对象名称当然是存在栈中的。
回复 使用道具 举报
p对象在运行p.speak()后释放,当一段代码定义一个变量以后,java在栈内存中为其分配空间,当超过了变量的作用域以后java会立即释放为其分配的空间在另作他用
堆内存是放new创建的对象和数组,在堆中非配的内存由java虚拟的自动垃圾回收机制(GC)自动回收,什么时候回收我就不知道了··
回复 使用道具 举报
栈空间是编译运行时会分配滴,在函数执行结束时这些存储单元自动被释放。
堆空间是new出来的空间,当这个内存空间的引用不存在的时候 会被垃圾回收器给回收.

p对象在运行p.speak()后释放 这句话是不对滴...
回复 使用道具 举报
栈空间是编译运行时会分配滴,在函数执行结束时这些存储单元自动被释放。
堆空间是new出来的空间,当这个内存空间的引用不存在的时候 会被垃圾回收器给回收.

p对象在运行p.speak()后释放 这句话是不对滴...
回复 使用道具 举报
pray 高级黑马 2014-4-26 04:26:42
7#
我是来收集资料滴...
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马