黑马程序员技术交流社区

标题: 关于类在内存的问题 [打印本页]

作者: 唐兴旺    时间: 2012-3-1 00:48
标题: 关于类在内存的问题
相信大家都知道,当我们new Class();的时候,内存中的堆内存会分配一块内存片,存放Class的实例。但是现在我有一个问题,当我用类名.静态方法时,内存中的变化是什么样的。

作者: Destiny    时间: 2012-3-1 10:30
方法为静态的时在运行时就会创建出来,不会等实例化再创建.而动态应该是程序运行到特定位置有实例化了才创建的。个人理解是这样的 ,跟操作系统中内存的动态分区分配一样吧~!
作者: 冯兵兵    时间: 2012-3-1 10:50
new 一个类对象时,会在堆内存分配一块空间,用来存放类对象,但静态方法存放在 方法区
作者: 葛尧    时间: 2012-3-1 13:51
标题:
本帖最后由 葛尧 于 2012-3-1 13:53 编辑

相关类加载时 静态成员就会在数据区创建并存储吧
类名.方法 就去方法区直接引用了?
作者: 李成航    时间: 2012-3-1 14:03
静态方法在第一次运行就会被加载,以后不会重复加载,类名.静态方法 访问时是直接调用而不会再去分配内存重新加载静态方法。个人理解
作者: 陈建凡    时间: 2012-3-1 15:12
    静态修饰符的特点
                       
1 随着类的加载而加载,随着类的消失而消失;
2 优先与对象而存在。
3 被所有的对象共享
4.可以直接被类名调用

  People p=new  People(); 这句话都做了什么?

1、因为 new 用到了People。class类 ,所以会先找到People.class文件并加载到内存中

2、 执行该类的static代码块 ,如果有的话,给People.class类进行初始化。

3、在推内存中 开辟 空间,分配内存地址

4、在推内存 建立对象 的特有属性,并进行 初始化

5、对属性进行显示初始化。

6、对对象进行构造函数的代码块的初始化

7.对对象 进行 对应的构造函数的初始化

8 将 内存地址 给栈 内存中的变量。
作者: 赵晓波    时间: 2012-3-1 15:44
new出来的对象放在堆内存里面,而方法放在代码区。用类名.静态方法 静态方法不再是针对某个对象调用,方法调用完以后栈里面分配的局部变量自动消失。
作者: 王杰    时间: 2012-3-1 21:07
相信大家都知道,当我们new Class();的时候,内存中的堆内存会分配一块内存片,存放Class的实例。但是现在我有一个问题,当我用类名.静态方法时,内存中的变化是什么样的。
我的理解是:当使用 类名.静态方法时,jvm会将相应的类文件加载到内存中,这时内存的方法区会将静态成员加载到其中,但是堆内存没有变化,因为堆内存是用来存放对象的,你都没有创建对象,那就不会有变化!




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