jvm static初始化
时间: 2023-07-04 15:13:45 浏览: 81
在Java虚拟机中,静态初始化是指在类加载时对静态变量进行初始化的过程。静态初始化是在类加载时完成的,且只会执行一次。当类被加载到虚拟机时,虚拟机会为这个类分配内存,并为该类中的静态变量分配内存空间,并将它们初始化为默认值(如果有的话)。随后,静态初始化器会按照代码中声明的顺序执行,对静态变量进行赋值。如果静态变量是final类型的,则必须在静态初始化器中进行赋值。
在Java中,可以使用静态初始化块或静态变量声明的方式对静态变量进行初始化。静态初始化块是一个被static修饰的代码块,它只会在类加载时执行一次,并且在静态变量声明之前执行。静态变量声明的方式是直接在变量名前加上static关键字,并在后面跟上赋值表达式。
例如:
```
public class Test {
static int i; // 静态变量声明
static {
i = 10; // 静态初始化块
}
}
```
在这个例子中,静态变量i被声明为静态变量,静态初始化块中对它进行了赋值。当Test类被加载到虚拟机时,静态初始化块会被执行,i会被赋值为10。
需要注意的是,静态初始化器是在类加载时执行的,因此它的执行顺序是按照代码中的声明顺序进行的。如果存在多个静态初始化块或静态变量声明,它们会按照声明顺序依次执行。
相关问题
companion object { private val sDataModel = DataModel() @JvmStatic fun getDataModel() = sDataModel }这种单例 和object DataModel{
这是Kotlin语言中创建单例模式的两种常见方式:
1. **Companion Object**:
使用`companion`关键字创建了一个静态内部类(实际上是一个Object)。在给定的例子中,`sDataModel`是私有的字段,表示数据模型的实例。`@JvmStatic`注解允许这个静态方法在不需要创建该类的对象的情况下被外部访问。通过`getDataModel()`函数获取单例`DataModel`。
```kotlin
fun getDataModel(): DataModel { return sDataModel } // 等同于 DataModel().sDataModel
```
当你需要一个全局可用的数据存储或其他无状态的辅助功能时,这种方式简洁高效。
2. **Object Literal or Singleton Class**:
另一种方式是在顶级定义一个名为`DataModel`的普通类,并将其初始化为单例。这意味着直接实例化它会返回同一个对象。例如:
```kotlin
object DataModel {
init {
// 初始化逻辑
}
val data: YourDataType // 或者其他属性
}
```
这里,`init`块用于执行一次性的初始化操作。访问`DataModel`就像访问一个常量一样。
public class A { static B b = new B(); A() { System.out.println("A构造器"); } static { System.out.println("A静态初始化块"); } }public class B { static A a = new A(); B() { System.out.println("B构造器"); } static { System.out.println("B静态初始化块"); } }public class Main { public static void main(String[] args) { A a = new A(); } }请解释一下这段代码的执行过程,深入到jvm的运行,并分析输出结果
这段代码的执行过程如下:
1. 程序执行 `main` 方法,创建 `A` 类的实例 `a`。
2. 在创建 `a` 的过程中,首先会执行 `A` 类的静态初始化块,输出 `A静态初始化块`。
3. 因为 `A` 类中有一个静态属性 `b` 是 `B` 类的实例,所以会执行 `B` 类的静态初始化块,输出 `B静态初始化块`。
4. 接着执行 `B` 类中的构造器,输出 `B构造器`。
5. 回到创建 `a` 的过程中,接着执行 `A` 类的构造器,输出 `A构造器`。
因此,最终的输出结果为:
```
A静态初始化块
B静态初始化块
B构造器
A构造器
```
在 JVM 中,类的静态初始化块会在类被加载时执行,而类的实例初始化块会在实例被创建时执行。此外,静态属性的初始化也会在类被加载时执行。因此,以上代码的执行顺序可以总结为:类加载 -> 静态初始化块 -> 静态属性初始化 -> 构造器。
阅读全文