# Java类初始化时机详解
## 引言
在Java中,类的初始化时机是一个非常重要的概念,对于一个刚入行的小白开发者来说,可能会感到困惑。本文将介绍Java类初始化的时机,包括静态变量、静态代码块、构造函数等的初始化顺序和过程,并通过具体的示例代码来帮助理解。
## 初始化流程
下面是Java类初始化的流程图,以便更直观地理解各个部分之间的关系。
```mermaid
erDiagra
原创
2024-05-06 03:41:05
32阅读
会初始化的情况1、创建类的实例。2、类的静态变量,或者为静态变量赋值。(被final修饰、已在编译期把结果放入常量池的静态字段除外)3、类的静态方法。4、使用反射来强制创建爱你某个类或接口对应的java.lang.Class对象。5、
原创
2022-03-02 15:38:32
568阅读
会初始化的情况1、创建类的实例。2、类的静态变量,或者为静态变量赋值。(被final修饰、已在编译期把结果放入常量池的静态字段除外)3、类的静态方法。4、使用反射来强制创建爱你某个类或接口对应的java.lang.Class对象。5、初始化某个类的子类。6、直接使用java.exe命令来运行某个主类。7、如果初始化一个类的时候,如果发现父类还没有初始化,则需要先触发其父...
原创
2021-08-06 16:24:40
1117阅读
虚拟机规范严格规定了有且只有5种情况必须立即对类进行初始化。
1)遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。
2)使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。
3)当初始化一个类的时候,如果发
转载
2023-06-03 23:46:56
188阅读
# Java Final类初始化时机
## 整体流程
下面是初始化Java final类的流程:
```mermaid
pie
title 初始化Java final类流程
"加载" : 20
"链接" : 30
"初始化" : 50
```
## 步骤及代码
1. **加载**:加载final类的.class文件到内存
```java
// 无需手动编
原创
2024-07-11 04:13:18
30阅读
实例变量属于Java类本身,只有当程序初始化该Java类时才会为该类的类变量分配内存空间,并执行初始化.从程序运行的角度来看,每JVM对一个Java类只初始化一次,因此Java程序每运行一次,系统只为类变量分配一次内存空间,执行一次初始化.从语法角度来看,程序可以在2个地方对类变量执行初始化:1)定义类变量时指定初始值;2)静态初始化块中对类变量指定初始值.这两种方式的执行顺序与它们在源程序中排列
转载
2023-06-18 21:06:16
150阅读
Java类加载时机及过程一、Java类记加载时机 关于在什么时候需要开始类加载的第一个阶段“加载”,Java虚拟机规范没有进行强制性的约束,这点可以交给虚拟机的具体实现来自由把握。但是对于初始化阶段,Java虚拟机则是严格规定了有且只有六种情况必须立即对类进行“初始化”(加载、验证、准备需要在此之前开始):遇到new、getstatic、putstatic或invokestatic这四条
转载
2023-06-14 22:03:52
82阅读
参考书籍:《深入理解Java虚拟机》周志明 1,类的生命周期2,类的初始化 《Java虚拟机规范》严格规定有且仅有六种情况必须对类立即进行初始化,分别是: 1. 遇到new,getstatic,putstatic,invokestatic这四个字节码指令时,如果类型没有进行初始化,则需要进行初始化。生成四条指令的代码场景:1. 使用new关键字实例化对象时
2. 读取或设置一个类型的静态字段时
转载
2023-06-27 12:37:59
128阅读
类的生命周期:Java类的初始化:本阶段负责为类变量赋正确的初始值。(类变量即静态变量)Java编译器把所有的类变量初始化语句和静态初始化器通通收集到方法中,该方法只能被JVM调用,专门承担初始化工作。初始化一个类必须保证其直接超类已被初始化。并非所有类都拥有()方法。以下类不会拥有方法:该类既没有声明任何类变量,也没有静态初始化语句。该类声明了类变量,但没有使用类变量初始化语句或静态初始化语句初
转载
2023-06-17 17:04:12
255阅读
感觉总结得不错.我也补充几点.
就是关于类的初始化顺序的问题,其实当java程序需要使用某个类时,java虚拟机会确保这个类已经被加载,连接,和初始化,其中连接过程又会执行验证,准备和解析这三个子步骤.这里不进行详细的讲解.有关资料可以去google下.
那么当类或者接口被加载和连接时,JVM严格定义了初始化的时机,所有的JVM实现必须在每个类或
转载
2023-08-03 15:04:58
76阅读
会发生类初始化的情况(5点)1.虚拟机启动时,初始化main方法所在的类。2.调用类的静态成员(final修饰除外),静态方法。3.new一个类的对象4.初始化一个类,其父类先被初始化,下面一个例子概括前4点public class Text {
static {
System.out.println("main类被加载!");
}
public static void main(String[]
转载
2023-05-30 14:33:09
166阅读
java虚拟机规范虽然没有强制性约束在什么时候开始类加载过程,但是对于类的初始化,虚拟机规范则严格规定了有且只有四种情况必须立即对类进行初始化,遇到new、getStatic、putStatic或invokeStatic这4条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。生成这4条指令最常见的java代码场景是:1)使用new关键字实例化对象2)读取一个类的静态字段(被final修饰
转载
2023-08-31 12:02:12
71阅读
前面讲过,java虚拟机只有在程序首次主动使用一个类或接口的时候才会初始化它。只有6种活动被看作是程序对类和接口的主动使用:1、创建类的实例。例如new语句创建实例,或者通过反射、克隆及序列号手段来创建实例。2、调用类的静态方法。3、访问某个类或接口的静态变量或者对该静态变量赋值。4、调用java API中某些反射方法,比如调用Class.forName("Worker")方法,加入Worker类
转载
2024-02-09 21:33:35
43阅读
类从被加载到JVM中开始,到卸载出内存为止,它的这个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段,其中加载、验证、准备、解析、初始化是类加载的过程。本章内容是类的初始化阶段。初始化时机遇到new、getstatic、putstatic、invokestatic这4条字节码指令时,如果类没有进行过初始化,要进行初始化。其中final修饰的静态字段除外,因为final static
转载
2024-03-11 09:09:01
38阅读
目录1. 类的加载时机2. 类的初始化会发生类的初始化的情况:不会发生类的初始化的情况: 1. 类的加载时机以下5个情况,只要有1个出现,那么类的加载器就会将这个类的class文件加载到内存中:创建类的实例。使用类的静态变量或静态方法。使用反射方式来强制创建某个类或接口对应的java.lang.Class对象。初始化某个类的子类。直接使用java.exe命令来运行某个主类。2. 类的初始化类的初
转载
2023-06-05 14:29:17
152阅读
<clinit>()方法Java 类加载的初始化过程中,编译器按语句在源文件中出现的顺序,依次自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并产生方法。 如果类中没有静态语句和静态代码块,那可以不生成<clinit>() 方法。并且 <clinit>() 不需要显式调用父类(接口除外,接口不需要调用父接口的初始化方法,只有使用到父接口中的静态变量时才需
转载
2024-06-22 14:39:43
35阅读
1.什么时候类必须初始化,什么情况类不会初始化虚拟机规范严格规定了有且只有五种情况必须立即对类进行“初始化”:使用new关键字实例化对象的时候、读取或设置一个类的静态字段的时候,已经调用一个类的静态方法的时候。使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有初始化,则需要先触发其初始化。当初始化一个类的时候,如果发现其父类没有被初始化就会先初始化它的父类。当虚拟机启
转载
2023-07-30 22:32:53
55阅读
类是什么时候初始化的?类初始化的时候会执行static块,这个是我们知道的。那么我们可以用static块来做个实验。上面代码输出是: hello world
init
this is a test这说明了什么?在调用TR.hello_world的时候,类并没有初始化!而是在调用其方法test的时候才初始化的。这是因为在编译的时候,常量(static final 修饰的)会存入调用类的常量
转载
2023-06-27 14:43:06
139阅读
深入理解类的初始化时机《Java虚拟机规范》初始化时机一初始化时机二初始化时机三初始化时机四初始化时机五初始化时机六 《Java虚拟机规范》关于在什么情况下需要开始类加载过程的的第一个阶段“加载”,《Java虚拟机规范中》并没有进行强制约束,这点可以交给虚拟机的具体实现来自由把握。但是对于初始化阶段,《Java虚拟机规范》则是严格规定了有且只有六种情况必须立即对类进行“初始化”(而加载、验证、准
转载
2023-09-26 17:02:52
65阅读
# Java 枚举初始化时机详解
Java 枚举(Enum)是一个非常强大的特性,它不仅仅是一个简单的类型安全的枚举,还可以拥有字段、方法和构造函数。理解枚举的初始化时机对于开发高质量的代码至关重要。本篇文章将通过代码示例详细说明这一点,并展示枚举在何时被初始化,以及如何在实际项目中使用它们。
## 什么是 Java 枚举
Java 枚举是一种特殊的类,用于表示一组固定的常量。使用枚举可以使