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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐兴旺 中级黑马   /  2012-3-1 00:48  /  2306 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

相信大家都知道,当我们new Class();的时候,内存中的堆内存会分配一块内存片,存放Class的实例。但是现在我有一个问题,当我用类名.静态方法时,内存中的变化是什么样的。

7 个回复

倒序浏览
方法为静态的时在运行时就会创建出来,不会等实例化再创建.而动态应该是程序运行到特定位置有实例化了才创建的。个人理解是这样的 ,跟操作系统中内存的动态分区分配一样吧~!
回复 使用道具 举报
new 一个类对象时,会在堆内存分配一块空间,用来存放类对象,但静态方法存放在 方法区
回复 使用道具 举报

本帖最后由 葛尧 于 2012-3-1 13:53 编辑

相关类加载时 静态成员就会在数据区创建并存储吧
类名.方法 就去方法区直接引用了?
回复 使用道具 举报
静态方法在第一次运行就会被加载,以后不会重复加载,类名.静态方法 访问时是直接调用而不会再去分配内存重新加载静态方法。个人理解
回复 使用道具 举报
    静态修饰符的特点
                       
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 18:06

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
new出来的对象放在堆内存里面,而方法放在代码区。用类名.静态方法 静态方法不再是针对某个对象调用,方法调用完以后栈里面分配的局部变量自动消失。
回复 使用道具 举报
王杰 黑马帝 2012-3-1 21:07:47
8#
相信大家都知道,当我们new Class();的时候,内存中的堆内存会分配一块内存片,存放Class的实例。但是现在我有一个问题,当我用类名.静态方法时,内存中的变化是什么样的。
我的理解是:当使用 类名.静态方法时,jvm会将相应的类文件加载到内存中,这时内存的方法区会将静态成员加载到其中,但是堆内存没有变化,因为堆内存是用来存放对象的,你都没有创建对象,那就不会有变化!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马