java class类对象 是在什么时候被加载的?
在 Java 中,类对象的加载时机通常指的是类加载机制中的"加载"阶段,而实例化则是指创建类的实例对象的过程。这两个过程是分开的,下面是详细的解释:
-
类加载时机:
- 类加载是指将类的
.class
文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class
对象,用来封装类在方法区内的数据结构。 - 根据 Java 虚拟机规范,类加载的具体时机是在程序第一次使用到该类时,这个动作是由 Java 虚拟机完成的,具体包括以下几种情况:
- 使用
new
关键字实例化对象时。 - 通过反射机制动态创建类实例时。
- 当调用
Class.forName
方法时,如果参数指定为boolean
值true
,那么也会触发类的加载。 - 初始化一个类的子类时。
- 静态字段赋值时,以及静态字段被访问时。
- 方法被调用时。
- 在
java.lang.invoke.MethodHandle
解析时。 - 创建数组时,如
new int[] { 1, 2 }
,会触发int
类的加载。
- 使用
- 类加载是指将类的
-
类实例化时机:
- 类实例化是指在 Java 堆内存中分配一个对象,并对其进行初始化,这通常发生在使用
new
关键字创建对象时。 - 实例化的具体时机是在代码中显式地通过
new
关键字或其他方式(如克隆、反序列化)创建类的实例时。
- 类实例化是指在 Java 堆内存中分配一个对象,并对其进行初始化,这通常发生在使用
总结来说,类的加载时机是在程序第一次主动使用类时触发的,而类的实例化是在代码中显式创建对象时发生的。类加载是一个自动的过程,由 Java 虚拟机控制,而实例化则是由程序员的代码控制的。