JVM 领略着实并不难!
常量会在编译阶段存入挪用者的常量池,本质上并没有直接引用到界说常量的类,因此不会触发界说常量的类初始化,示例代码如下:
上面代码不会呈现ConstClass init! 加载 加载进程首要做以下3件事 1.通过一个类的全限命名称来获取此类的二进制流 2.强这个字节约所代表的静态存储布局转化为要领区的运行时数据布局 3.在内存中天生一个代表这个类的java.lang.Class工具,作为要领区这个类的各类数据会见进口。 验证 这个阶段首要是为了确保Class文件字节约中包括信息切合当前假造机的要求,而且不会呈现危害假造机自身的安详。 筹备 筹备阶段是正式为类变量分派内存并配置类变量初始值的阶段,这些变量所行使的内存都在要领区平分派。起首,这个时辰分派内存仅仅包罗类变量(被static修饰的变量),而不包罗实例变量。实例变量会在工具实例化时跟着工具一路分派在java堆中。其次这里所说的初始值“凡是环境下”是数据范例的零值,假设一个类变量界说为
那变量value在筹备阶段后的初始值是0,而不是123,由于还没有执行任何Java要领,而把value赋值为123是在措施编译后,存放在类结构函数()要领中。 理会 理会阶段是把假造机中常量池的标记引用替代为直接引用的进程。 初始化 类初始化时类加载的最后一步,前面类加载进程中,除了加载阶段用户可以通过自界说类加载器参加以外,别的举措都是假造机主导和节制。到了初始化阶段,才是真正执行类中界说Java措施代码。 筹备阶段中,变量已经赋过一次体系要求的初始值,而在初始化阶段,按照措施员通过措施拟定的主观打算初始化类变量。初始化进程着实是执行类结构器()要领的进程。 ()要领是由编译器自动网络类中全部类变量的赋值举措和静态语句块中的语句归并发生的。网络的次序是凭证语句在源文件中呈现的次序。静态语句块中只能会见界说在静态语句块之前的变量,界说在它之后的变量可以赋值,但不能会见。如下所示:
()要领与类结构函数(可能说实例结构器())差异,他不必要显式地挪用父类结构器,假造机遇担保子类的()要领执行之前,父类的()已经执行完毕。 类加载器 关于自界说类加载器,和双亲委派模子,这里不再提,写了几个小时了,该洗洗睡了~ 【编辑保举】
点赞 0 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |