老师,请问类加载的时间?

老师,请问类加载的时间?

http://img1.sycdn.imooc.com//climg/608805ce09b56f6308680636.jpg

老师,如上,我执行Earth one,这个时候类加载了么?为什么没有输出?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕小班 2021-04-29 10:28:09

同学你好,1、我们编写的java文件都是保存着业务逻辑代码。java编译器将 .java 文件编译成扩展名为 .class 的文件。.class 文件中保存着java转换后,虚拟机将要执行的指令。当需要某个类的时候,java虚拟机会加载 .class 文件,并创建对应的class对象,将class文件加载到虚拟机的内存,这个过程被称为类的加载。

类加载的过程包括以下的步骤:

http://img1.sycdn.imooc.com//climg/608a14d109a492ae08010254.jpg

加载-->类加载过程的一个阶段,ClassLoader通过一个类的完全限定名查找此类字节码文件,并利用字节码文件创建一个class对象。


验证-->目的在于确保class文件的字节流中包含信息符合当前虚拟机要求,不会危害虚拟机自身的安全,主要包括四种验证:文件格式的验证,元数据的验证,字节码验证,符号引用验证。


准备-->为类变量(static修饰的字段变量)分配内存并且设置该类变量的初始值,(如static int i = 5 这里只是将 i 赋值为0,在初始化的阶段再把 i 赋值为5),这里不包含final修饰的static ,因为final在编译的时候就已经分配了。这里不会为实例变量分配初始化,类变量会分配在方法区中,实例变量会随着对象分配到Java堆中。


解析-->这里主要的任务是把常量池中的符号引用替换成直接引用


初始化-->这里是类记载的最后阶段,如果该类具有父类就进行对父类进行初始化,执行其静态初始化器(静态代码块)和静态初始化成员变量。(前面已经对static 初始化了默认值,这里我们对它进行赋值,成员变量也将被初始化)

如上就是类加载的过程。

    ​2、类加载的时机

    ​    ​    ​隐式加载 new 创建类的实例,

    ​    ​    ​显式加载:loaderClass,forName等

    ​    ​    ​访问类的静态变量,或者为静态变量赋值

    ​    ​    ​调用类的静态方法

    ​    ​    ​使用反射方式创建某个类或者接口对象的Class对象。

    ​    ​    ​初始化某个类的子类

    ​    ​    ​直接使用java.exe命令来运行某个主类

在当前学习进度中,我们只学习了隐式加载 new 创建类的实例,当调用new创建实例对象时,就会触发类加载,所以在同学的代码中,只声明Earth one; 对象,并不会触发类加载。

祝学习愉快!

好帮手慕小班 2021-04-28 11:15:12

同学你好,类加载是当Java虚拟机第一次需要使用类信息时就会进行类加载。

如上所描述,同学只是声明了一个Earth,并没有实例化对象,所以此时并不需要使用类信息,所以不会执行类加载。

祝学习愉快!

  • 提问者 飞飞侠91 #1

    那是否可以理解必须实例化对象才能进行类加载?声明不是使用类信息么?老师,可以帮忙把原理详细讲解下么?

    2021-04-28 23:05:05
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师