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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

郭嵘

注册黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 郭嵘 注册黑马   /  2012-5-31 14:19  /  1843 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郭嵘 于 2012-5-31 14:43 编辑

  各位学长学姐,老师,你们好 我是一个刚开始学习java的新手,刚看视频,遇到一个小问题,像定义一个变量,会存放在栈内存中,定义一个对象会储存在堆内存中,定义一个static,会存储在共享区,那么定义一个类,此类是存储在内存中的哪里呢,或者是类只是用来描述对象的,根本不进内存呢?

8 个回复

倒序浏览
本帖最后由 刘伯阳 于 2012-5-31 15:19 编辑

好吧,这个问题我也没有查过。根据我的理解,一个类当它没有被实例化的时候(没有new出来的时候),它没有在内存中分配地址空间。我估计在内存中应该是没有存放的。存在硬盘上面了吧。

评分

参与人数 1黑马币 +2 收起 理由
郭嵘 + 2 赞一个!

查看全部评分

回复 使用道具 举报
应该是存放在硬盘中的,当你new对象的时候才会加载该类,然后根据类的情况(函数等等)在内存里分配地址 没new对象时是不会在内存里分配地址的

评分

参与人数 1黑马币 +2 收起 理由
郭嵘 + 2 赞一个!

查看全部评分

回复 使用道具 举报
还真没想过这个问题,小伙子有前途,我也好好想想,应该是硬盘里面吧!
回复 使用道具 举报
本帖最后由 李天甲 于 2012-5-31 16:00 编辑

刚才查了一下,有一个东西叫做“类加载器”当需要这个类的时候类加载器会加载某一个类。这个一般是虚拟机来负责的。JVM运行Java程序的时候,它会加载对应的class文件,并提取class文件中的信息存放在JVM开辟出来的方法区内存中。
当然这个加载器是什么,我也不清楚,可以参考一篇文章“深入探讨Java 类加载器” (http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 呵呵,好像发帖不能用超级链接啊 ) 上面的链接是IBM develop上的一个说明。咱们一起简单了解一下吧。

回复 使用道具 举报
一个类经过编译后编程了class文件,当运行程序的时候,系统会加载带有main函数的文件,在运行的时候如果还需要其它的文件则在从硬盘上加载到内存中,
回复 使用道具 举报
本帖最后由 郑文博 于 2012-5-31 16:30 编辑

我想先给你的话挑个瑕疵。。。 变量不是全都存放在栈内存的。局部变量是作用于函数或语句中的,他存储于栈内存。而成员变量是作用于类中的,他是存储在堆内存的。从这一点一般就能确定类是在堆内存的。暂时不知道特殊情况,我也反反复复看了第五天的视频好多次才有所领悟。建议楼主也再仔细看看面向对象这部分视频,问题很多的。共同努力吧{:soso_e121:}
回复 使用道具 举报
首先要说下java中内存分配的常识
1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
3. 堆:存放所有new出来的对象。
4. 静态域 :存放静态成员(static定义的)
5. 常量池 :存放字符串常量和基本类型常量(public static final)。
6. 非RAM存储:硬盘等永久存储空间
类中包含基本数据类型、变量数据、静态成员、基本类型常量.....而这些元素是类中的某一部分  你能说类放在内存中的具体哪个地方吗,
而我们运行某个程序(java编辑器)时是要加载到内存上的,我们定义一个类说明我们正在通过编辑器操作操作它,它当然就在内存当中了
当我们编写完某个程序时通过javac命令编辑生成.class文件。当我们不使用时它是保存在硬盘上的。
再想使用它时就要通过java中有个叫类加载器的东西把它加载到内存当中使用
有点啰嗦,应该讲清楚了吧{:soso_e113:}
回复 使用道具 举报
当我们用编辑器编写代码,定义一个类时候,由于编辑器本身是个软件在运行,所以定义一个类的时候,此时这个类无可厚非的在内存里呆着,等编写定义完了,不用的时候,因为你定义的类存在一个文件里,所以就会随着文件安静的在硬盘里呆着。等到你再次用到这个文件中的类时候,类加载器就会来加载 Java 类到 Java 虚拟机中。这时候原先定义的类就又跑到内存里了,一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance()方法就可以创建出该类的一个对象。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马