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)
Test
类,因为创建了一个新实例Test4
未加载,因为只使用了常量变量,这与上面的第4条规则冲突Test3
和Test2
是在加载Test
之后加载的,因为Test2
对象是在Test
的实例初始值设定项中创建的,这也导致加载Test3
(超类)当。注意到初始化与加载(或链接)不同时,这一点得到确认。如果测试类没有在第(1)行加载,那么什么类型将有变量t?在JVM中,变量
t
还不存在;它还没有分配。