Java 什么时候加载类?

Java 什么时候加载类?,java,class,loading,Java,Class,Loading,我有这样一个密码: public class Main { public static void main(String[] args) { Test t; //1 Integer i = new Integer(1); //2 t = new Test(); //3 System.out.println(Test4.a); //4 } } class Test { private int a = 10;

我有这样一个密码:

public class Main {
    public static void main(String[] args) {
        Test t; //1
        Integer i = new Integer(1); //2
        t = new Test(); //3
        System.out.println(Test4.a); //4
    }
}

class Test {
    private int a = 10;
    private Test2 t2; //5

    List<Test2> list = new ArrayList<Test2>() {
        {
            for (int i = 0; i < a; i++) {
                add(new Test2()); //6
            }
        }
    };
}

class Test2 extends Test3{
}

class Test3 {
}

class Test4 {
    public static final int a = 4;
}
公共类主{
公共静态void main(字符串[]args){
测试t;//1
整数i=新整数(1);//2
t=新测试();//3
System.out.println(Test4.a);//4
}
}
课堂测试{
私人INTA=10;
私有Test2 t2;//5
列表=新的ArrayList(){
{
for(int i=0;i
我不知道如何(全部或部分)以及何时加载类。因此:

  • 测试t-它不是一种有效用法,但引用
    t
    必须是一种特定类型的。是否加载了测试类(可能是部分加载,然后是多少个阶段-加载\链接\初始化-它通过了),或者什么都没有发生
  • 整数i=新整数(1)-是在JVM启动时加载的整数还是在此行中加载的整数
  • t=新测试()-一种有效的用法。它是从一开始就满载还是从某个点满载(见1)
  • System.out.println(Test4.a)-是否加载了
    Test4
  • 是否加载了
    Test2
    Test3
    ?如果是,那么什么时候

  • 当类被加载时,将由

    类或接口类型T将在第一次出现以下任一情况之前立即初始化:

    • T是一个类,并且创建了T的一个实例

    • T是一个类,调用由T声明的静态方法

    • 分配了一个由T声明的静态字段

    • 使用T声明的静态字段,该字段不是常量变量(§4.12.4)

    • T是一个顶级类(§7.6),执行嵌套在T(§8.1.3)中的assert语句(§14.10)

    (剪报)

    在任何其他情况下,类或接口都不会初始化

    讨论加载、链接和初始化类

    Java虚拟机动态加载、链接和初始化类和接口。加载是查找具有特定名称的类或接口类型的二进制表示形式并从该二进制表示形式创建类或接口的过程。链接是获取类或接口并将其组合到Java虚拟机的运行时状态以便执行的过程。类或接口的初始化包括执行类或接口初始化方法(§2.9)

    你的问题:

  • 声明变量不会加载该类。但加载发生在链接之前,链接发生在初始化之前。因此,当加载一个类时,它也会被链接和初始化
  • 代码>整数类在代码运行之前由JVM(连同许多其他语言基础类)加载。
  • 现在加载了
    Test
    类,因为创建了一个新实例
  • Test4
    未加载,因为只使用了常量变量,这与上面的第4条规则冲突
  • Test3
    Test2
    是在加载
    Test
    之后加载的,因为
    Test2
    对象是在
    Test
    的实例初始值设定项中创建的,这也导致加载
    Test3
    (超类)

  • 当。

    注意到初始化与加载(或链接)不同时,这一点得到确认。如果测试类没有在第(1)行加载,那么什么类型将有变量t?在JVM中,变量
    t
    还不存在;它还没有分配。