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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王春祥 中级黑马   /  2012-3-16 20:51  /  2273 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天看着视频突然有了点疑问,对象是类的实例,建立的时候会开辟内存空间,那么类呢,声明类后内存是什么表现呢,类在实例化之前java是怎么管理它的呢,还有函数,比如hello word程序,它没有变量,它在内存中是什么体现呢

9 个回复

倒序浏览
流程:
-->1,程序员敲代码得到源代码文件(.java)
-->2,编译器(javac.exe)编译,生成可以运行的字节码文件(.class),而这个.class文件就是一个对象。
-->3,运行工具(java.exe)运行,把字节码文件读取放到内存中
-->4,主函数开始运行,一句一句执行,当读到变量(符号)时,会先在本类中找变量;读到new对象语句,就去调用相应的类的字节码文件,出现异常就报异常。
-->5,执行完代码或者遇到结束语句或遇到强行关闭时,程序停止,堆内存中的数据成为垃圾,不定时被清除。
-->6,再运行,就再次加载字节码文件,重复以上流程。
补充:关于管理,源文件和字节码文件都在硬盘中,字节码数据进内存,出内存。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
class SM
{
int a =2;
public void b()
{
      SM c = new SM();}
}
java把内存空间划分为:栈内存、堆内存、方法区
声明对象时,在栈内存开辟储存空间,用于存储被引用数据的地址;即栈内存存放各种名字,比如例句里的c
使用new语句或者是声明变量时,在堆内存开辟空间,用于存储具体的属性值;即堆内存存放的是数据,比如例句里的a(调用时为c.a )
建立方法或者声明静态属性时,在方法区开辟空间,用于存储在整个软件运行过程中都会存在的数据、代码,比如例句里的b,

例句里的内存使用情况为:
首先有一个调用b方法的语句。b被加载进方法区。
b执行到"SM c"就会在栈内存开辟一块叫c 的空间,在这里c仅用于储存对象的堆内存地址,c 的大小与对象的大小无关。
执行到"new SM"就开始建立一个SM类的对象,发现有一个属性a,即在堆内存里开辟空间给a使用,对象建立完毕
执行"="将开辟的对象内存地址放入到c的储存里面。

注意具体对象和引用的区别。比如SM c = null,这时类引用c 已经存在,但是堆内存里还没有对象被其引用。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
至于hello world,
首先在方法区为方法开辟空间,打印执行打印语句时,“hello world”是一个字符串,作为一个String类的对象存在于堆内存,程序是没有建立它的引用就直接使用了,输出“hello world”时,方法区代码直接从堆内存调用了“hello world”。
回复 使用道具 举报
没有new的话 java虚拟机没有去调用这个类,那么这个类不在内存中!

好比计算机的内存和硬盘中电影,只有调用播放器去打开电影的时候,电影的数据才会出现在内存中!
回复 使用道具 举报
非常感谢
回复 使用道具 举报
丁佼 发表于 2012-3-16 23:36
class SM
{
int a =2;

可们讲得挺不错的。
回复 使用道具 举报
丁佼 黑马帝 2012-3-19 01:13:26
8#
liuhao411 发表于 2012-3-18 22:21
可们讲得挺不错的。

哦哈哈哈哈,谢谢。:lol第一次有人夸!
回复 使用道具 举报
黑马肖凯骏 发表于 2012-3-16 23:42
没有new的话 java虚拟机没有去调用这个类,那么这个类不在内存中!

好比计算机的内存和硬盘中电影,只有 ...

有部分类在JVM运行的时候就自动加载了的 所以是在内存中的 底层的那些类 但也是类哈哈
回复 使用道具 举报
丁佼 发表于 2012-3-19 01:13
哦哈哈哈哈,谢谢。第一次有人夸!

为什么你的技术那么高呢??
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马