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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

方谋富

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 方谋富 初级黑马   /  2014-4-28 23:06  /  801 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

编译和运行时期类是如何加载的啊?
第一天提问,希望斑竹能给分啊!

2 个回复

倒序浏览
数据成员可以分静态变量、非静态变量两种.
静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员.

非成静态员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成员的生存期决定于该类的生存期..而静态成员则不存在生存期的概念,因为静态成员始终驻留在内存中..

类所有内容加载顺序和内存中的存放位置:
利用语句进行分析。
1.Person p=new Person("zhangsan",20);
该句话所做的事情:
1.在栈内存中,开辟main函数的空间,建立main函数的变量 p。
2.加载类文件:因为new要用到Person.class,所以要先从硬盘中找到Person.class类文件,并加载到内存中。
加载类文件时,除了非静态成员变量(对象的特有属性)不会被加载,其它的都会被加载。
记住:加载,是将类文件中的一行行内容存放到了内存当中,并不会执行任何语句。---->加载时期,即使有输出语句也不会执行。
静态成员变量(类变量)  ----->方法区的静态部分
静态方法              
----->方法区的静态部分
非静态方法(包括构造函数)  ----->方法区的非静态部分
静态代码块 ----->方法区的静态部分
构造代码块 ----->方法区的静态部分

注意:在Person.class文件加载时,静态方法和非静态方法都会加载到方法区中,只不过要调用到非静态方法时需要先实例化一个对象
,对象才能调用非静态方法。如果让类中所有的非静态方法都随着对象的实例化而建立一次,那么会大量消耗内存资源,
所以才会让所有对象共享这些非静态方法,然后用this关键字指向调用非静态方法的对象。



1.类以及类里的成员,在编译时,由编译器加载到内存并编译成字节码文件.

2.类以及类的成员的字节码文件,由虚拟机的类加载器加载到内存并运行.

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 神马 于 2014-4-29 17:52 编辑

编译时虚拟机不启动,所以类还没有加载。运行时,当类被第一次使用时,被加载进内存。一次运行中,类只会被加载一次。加载过程是由虚拟机的类加载器完成的,当然也可以自定义类加载器,一般用不着。
加载,是将类文件中的一行行内容存放到了内存当中,并不会执行任何语句。---->加载时期,即使有输出语句也不会执行。
静态成员变量(类变量)            ----->方法区的静态部分
静态方法                                     ----->方法区的静态部分
非静态方法(包括构造函数)     ----->方法区的非静态部分
静态代码块                                 ----->方法区的静态部分
构造代码块                                 ----->方法区的静态部分
非静态成员变量                          ----->堆内存
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马