黑马程序员技术交流社区

标题: 关于类的疑问 [打印本页]

作者: 王春祥    时间: 2012-3-16 20:51
标题: 关于类的疑问
今天看着视频突然有了点疑问,对象是类的实例,建立的时候会开辟内存空间,那么类呢,声明类后内存是什么表现呢,类在实例化之前java是怎么管理它的呢,还有函数,比如hello word程序,它没有变量,它在内存中是什么体现呢
作者: OMG    时间: 2012-3-16 21:42
流程:
-->1,程序员敲代码得到源代码文件(.java)
-->2,编译器(javac.exe)编译,生成可以运行的字节码文件(.class),而这个.class文件就是一个对象。
-->3,运行工具(java.exe)运行,把字节码文件读取放到内存中
-->4,主函数开始运行,一句一句执行,当读到变量(符号)时,会先在本类中找变量;读到new对象语句,就去调用相应的类的字节码文件,出现异常就报异常。
-->5,执行完代码或者遇到结束语句或遇到强行关闭时,程序停止,堆内存中的数据成为垃圾,不定时被清除。
-->6,再运行,就再次加载字节码文件,重复以上流程。
补充:关于管理,源文件和字节码文件都在硬盘中,字节码数据进内存,出内存。
作者: 丁佼    时间: 2012-3-16 23:36
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 已经存在,但是堆内存里还没有对象被其引用。
作者: 丁佼    时间: 2012-3-16 23:41
至于hello world,
首先在方法区为方法开辟空间,打印执行打印语句时,“hello world”是一个字符串,作为一个String类的对象存在于堆内存,程序是没有建立它的引用就直接使用了,输出“hello world”时,方法区代码直接从堆内存调用了“hello world”。
作者: 黑马肖凯骏    时间: 2012-3-16 23:42
没有new的话 java虚拟机没有去调用这个类,那么这个类不在内存中!

好比计算机的内存和硬盘中电影,只有调用播放器去打开电影的时候,电影的数据才会出现在内存中!
作者: 王春祥    时间: 2012-3-18 22:06
非常感谢
作者: 刘_浩    时间: 2012-3-18 22:21
丁佼 发表于 2012-3-16 23:36
class SM
{
int a =2;

可们讲得挺不错的。
作者: 丁佼    时间: 2012-3-19 01:13
liuhao411 发表于 2012-3-18 22:21
可们讲得挺不错的。

哦哈哈哈哈,谢谢。:lol第一次有人夸!
作者: 泮和顺    时间: 2012-3-19 15:41
黑马肖凯骏 发表于 2012-3-16 23:42
没有new的话 java虚拟机没有去调用这个类,那么这个类不在内存中!

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

有部分类在JVM运行的时候就自动加载了的 所以是在内存中的 底层的那些类 但也是类哈哈
作者: 刘_浩    时间: 2012-3-19 20:28
丁佼 发表于 2012-3-19 01:13
哦哈哈哈哈,谢谢。第一次有人夸!

为什么你的技术那么高呢??




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