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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 徐宏波 于 2012-3-19 12:04 编辑

class Person{
        int age;//我知道他是在堆内存中,但是,,为什么呢,,是因为他是在类开始就定义的变量嘛?
          //同样的如果int age;是在函数下边,就存在栈内存中了;
          //所以我觉得就是:如果在函数之前定义的变量,就直接存在堆内存中,如果是在函数下面,就是存在栈内存中,对嘛????
        void speak()
        {
                System.out.println("age="+age);
        }
}
class Persondemo
{
        public static void main(String[] args)
        {
                Person p=new Person();
                p.age=20;
                p.speak();
        }
}
还有个问题就是,一个程序有N个类,,执行的时候,肯定是先执行主函数的类了,然后呢,,是跑到最上边开始往下来嘛?还是怎样?

6 个回复

倒序浏览
堆内存主要存放对象,栈内存主要用来执行程序。
所以定义age语句放在在函数中,是用来执行程序的,那么存放在占内存中。
如果age是创建的对象,那么放在对内存中,

在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。

堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。

引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!
回复 使用道具 举报
1.栈内存中存的是基本数据类型对象和非基本数据对象引用
2.方法区存放的是全局变量和静态变量,是程序中唯一的那些东西像class等
3.new 出的对象都在堆内存中,一旦实例化,name 引用放入栈区里, name 对象放入堆里,age同样
回复 使用道具 举报
杨华威 发表于 2012-3-19 11:34
堆内存主要存放对象,栈内存主要用来执行程序。
所以定义age语句放在在函数中,是用来执行程序的,那么存放 ...

这些概念的我懂的,,只是不知道我这样理解可不可以....
回复 使用道具 举报
徐宏波 发表于 2012-3-19 12:05
这些概念的我懂的,,只是不知道我这样理解可不可以....

你这个是自己的类定义里的部分,当这个类没被用来创建对象或者其中静态成员被调用的时候他什么都不是.
然后后面跟他们说的一样...
具体类怎么能有这个机制 那是类加载器的事情,深入到底层就复杂了。。。
回复 使用道具 举报
栈内存:数据使用完毕,会自动释放,定义的局部变量都在栈内存中,也就是定义在方法之中以及方法的参数,或者是循环之中的变量都是存放在栈内存中
堆内存:new 出来的东西都在堆内存中,存放的都是实体,实体包括数组和对象,例如创建一个数组,其数组内容就是实体,是存放在堆内存中的,我们使用的时候是通过引用数据类型,也就是存放在栈内存中指向数组地址的引用变量,来访问该数组对象的具体内容
回复 使用道具 举报
这是我的理解!

QQ截图20120319155915.jpg (32.97 KB, 下载次数: 21)

QQ截图20120319155915.jpg

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 赞一个!

查看全部评分

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