JVM虚拟机类加载机制(一)

Java28

类的整个生命周期从加载到虚拟机内存时开始,到卸载时结束。整个生命周期包括七个阶段:加载、验证、准备、解析、初始化、使用和卸载。核查、准备和解决的三个部分统称为连接。

[En]

The entire life cycle of a class starts when it is loaded into the virtual machine memory and ends when it is unloaded. The whole life cycle includes seven stages: loading, verification, preparation, parsing, initialization, use, and unloading. The three parts of verification, preparation and resolution are collectively referred to as connection.

类初始化情况:

  • 遇到new、getstatic、putstatic 或 invokestatic 这4条字节码指令时,如果没有初始化,则需要触发初始化。生成这4条指令的最常见Java代码场景是:使用new关键字实例化对象的时候、读取或设置一个类的静态字段,以及调用一个类的静态方法时。
  • 使用java.lang.reflect包的方法对类进行发射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。
  • 初始化类时,如果其父类尚未初始化,则需要首先触发其父类的初始化。
    [En]

    When initializing a class, if its parent class has not been initialized, the initialization of its parent class needs to be triggered first.*

  • 当虚拟机启动时,用户需要指定要执行的主类。虚拟机首先初始化这个主类。
    [En]

    When the virtual machine starts, the user needs to specify a main class to be executed. The virtual machine first initializes this main class.*

以上四个场景成为类的活动引用。此外,所有引用类的方法都不会触发初始化——被动引用。

[En]

The above four scenarios become active references of classes. In addition, all methods of referencing classes will not trigger initialization -- passive reference.

第一种情况

对于静态字段,只初始化直接定义此字段的类。因此,通过父类的子类引用父类中定义的静态字段只会触发父类的初始化,而不会触发子类的初始化。

[En]

For static fields, only the class that directly defines this field will be initialized. Therefore, referencing the static fields defined in the parent class through its subclasses will only trigger the initialization of the parent class, not the initialization of the child class.

```
package main.java.loadclass;

public class SubClass extends SupperClass{
static {

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长

相关文章
Java(6)控制流程 Java

Java(6)控制流程

与任何程序设计语言一样,Java使用条件语句和循环结构确定控制流程。 块作用域 我们首先要了解块(block)的概念。 块是指由若干条Java语句组成的语句,并用一对大括号括起来。块确定了变量的作用域...
类加载器ClassLoader Java

类加载器ClassLoader

1.双亲委派模型 java是根据双亲委派模型的加载类的,当一个类加载器加载类时,会先尝试委托给父类加载器去加载,直到到达启动类加载器顶层若加载不了,则再让子类加载器去加载直到类成功加载,否则抛出异常。...
rabbitmq 一些参数设置 Java

rabbitmq 一些参数设置

rabbitmq 方法的一些参数设置以及解释 消费者采用手动应答 // 采用手动应答 false 采用手动应答,true采用自动应答 boolean autoAck = false; channel....
MySQL的三值逻辑 Java

MySQL的三值逻辑

MySQL 采用三值逻辑 SELECT 1 = 1; SELECT 1 = 2; SELECT 1 = NULL; SELECT 1 != NULL; 上面四条语句的结果分别为: 可见MySQL采用三...
Dubbo浅入浅出 Java

Dubbo浅入浅出

接下来一段时间敖丙将带大家开启紧张刺激的 Dubbo 之旅!是的要开始写 Dubbo 系列的文章了,之前我已经写过一篇架构演进的文章,也说明了微服务的普及化以及重要性,服务化场景下随之而来的就是服务之...
Storm2 Java

Storm2

```java;gutter:true; package storm.scheduler; import java.util.ArrayList; import java.util.Collectio...
阿里面试:MySQL如何设计索引更高效? Java

阿里面试:MySQL如何设计索引更高效?

数据库系列迄今已更新。我想你对所有的概念都有大致的了解。当我阅读本周的评论时,我发现一位网友提出了一个有趣的问题:帅冰是如何设计索引的?如何设计索引?如何更有效地设计?[En]The database...