静态初始化,主要和主要执行顺序

问题描述 投票:0回答:1

假设我具有以下项目结构:

Inst.java

import java.lang.instrument.Instrumentation;

final public class Inst {
    private static Instrumentation instrumentation;

    public static void premain(String args, Instrumentation inst) {
        instrumentation = inst;
    }

    public static long sizeof(Object o) {
        return instrumentation.getObjectSize(o);
    }
}

Constants.java

public class Constants {
    public static final int MAX_LENGTH = 10;
}

SomeClass.java

public class SomeClass {
    private int myVar;

    public SomeClass(final int myVar) {
        this.myVar = myVar;
    }

    public static class StaticClass {
        private static final int SOME_VAR = 1;
    }
}

Main.java

public class Main {
    public static void main(String [] args) {
        int init = Constants.MAX_LENGTH;
        SomeClass clazz = new SomeClass(init);           
    }
}

Oracle文档声明以下内容:

Java虚拟机(JVM)初始化后,将按照指定代理的顺序调用每个premain方法,然后将调用实际的应用程序main方法。

在我看来,这意味着在初始化JVM之后,[[立即]]会调用premain方法,因此,在此示例中,首先会初始化Inst另外,据我所知,static是在加载类时或更普遍地在对类的第一次引用时初始化的。

因此,在此示例中,初始化和执行顺序如下:

    [JVM初始化后调用premain()
  1. main()被称为应用程序的入口点
  2. [Constants.MAX_LENGTH被初始化(在main中引用)
  3. StaticClass被初始化(由于创建了外部类的实例)
  4. 创建SomeClass的实例
  5. 我的问题如下:

    以上订购是否正确?
  1. 例如,如果主要方法是空的?由于完全没有引用静态值(和类),因此我认为它们根本没有初始化。
  2. 如果我引用例如我的Constants.MAX_LENGTH类中的Inst?我会收到运行时错误吗?
  3. 初始化
  4. 总是
  5. 是按引用顺序完成的,还是有例外?
假设我具有以下项目结构:Inst.java import java.lang.instrument.Instrumentation;最终的公共类Inst { ...
java static initialization
1个回答
1
投票
正如您提到的,在加载类之后,将立即调用静态初始化器。但是在需要这些类之前先加载类。因此,在调用main()之前,先加载Constants,然后加载SomeClass
© www.soinside.com 2019 - 2024. All rights reserved.