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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 136616244 中级黑马   /  2014-4-29 13:38  /  1402 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

类所有内容加载顺序和内存中的存放位置:
利用语句进行分析。
1.Person p=new Person("zhangsan",20);
该句话所做的事情:
1.在栈内存中,开辟main函数的空间,建立main函数的变量 p。
2.
加载类文件:因为new要用到Person.class,所以要先从硬盘中找到Person.class类文件,并加载到内存中。
加载类文件时,除了非静态成员变量(对象的特有属性)不会被加载,其它的都会被加载。
记住:加载,是将类文件中的一行行内容存放到了内存当中,并不会执行任何语句。---->加载时期,即使有输出语句也不会执行。
静态成员变量(类变量)  ----->方法区的静态部分
静态方法              
----->方法区的静态部分
非静态方法(包括构造函数)  ----->方法区的非静态部分
静态代码块 ----->方法区的静态部分
构造代码块 ----->方法区的静态部分
注意:在Person.class文件加载时,静态方法和非静态方法都会加载到方法区中,只不过要调用到非静态方法时需要先实例化一个对象
,对象才能调用非静态方法。如果让类中所有的非静态方法都随着对象的实例化而建立一次,那么会大量消耗内存资源,
所以才会让所有对象共享这些非静态方法,然后用this关键字指向调用非静态方法的对象。



那么如果在类中定义了一个非静态成员变量 int x = 0;这句是什么时候进内存的,什么时候在对象中建立的?

4 个回复

倒序浏览
嗯!对于你说的int x = 0的话,什么时候进内存,我想在它编译完之后就已经进内存了吧,因为int的话,它是一个4个字节的类型数据,所以在声明的时候,就给了它4个字节的空间,其实如果这是局部变量的话,它是在栈里面的,还有就是什么时候在对象中建立的,这样视情况而定,因为他有包装类,需要对他进行装箱和拆箱的操作!
回复 使用道具 举报
变量一共分为三类:局部变量、非静态成员变量、静态成员变量
1、局部变量存在于栈内存中,用到时才分配空间,用完就消失了。
2、非静态成员变量在堆内存中,因为对象的存在,才在内存中存在。
3、静态成员变量存在于方法区的静态区中,随着类的加载而存在。

所以int x = 0是在new Person("zhangsan",20)这个创建Person类对象动作执行时进入堆内存中的,并进行了显式赋值。

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我的理解是:首先,所有类在加载时只会被加载一次。当类被第一次使用时,加载这个类,具体过程跟楼主所说的一样,但是有一点:类在加载时会由虚拟机在堆区建立一个java.lang.Class对象,(万物皆对象,类可以用来new对象,而它本身也是一个对象),而x这样的非静态成员变量在new对象之前就是在这个java.lang.Class对象中,归根到底就是在堆中。

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我以为那句话在加载类的时候就已经加载了吧?只不过给这个类实例化的时候才给x分配空间而已。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马