java类初始化顺序,它是如何工作的?
运行后:java类初始化顺序,它是如何工作的?,java,class,initialization,Java,Class,Initialization,运行后: package ali; public class test { public static int n = 99; public static test t1 = new test("t1"); public static test t2 = new test("t2"); public static int i = 0; public static int j = i; { System.out.println("construct block"); } stati
package ali;
public class test {
public static int n = 99;
public static test t1 = new test("t1");
public static test t2 = new test("t2");
public static int i = 0;
public static int j = i;
{
System.out.println("construct block");
}
static {
System.out.println("static construct block");
}
public test(String str){
System.out.println((++j) + ":" + " i="+ i + " n="+n+str);
n++;i++;
}
public static void main(String [] args){
test test1 = new test("initl");
}
}
谁能告诉我它是怎么工作的?
为什么创建t1和t2时没有“静态构造块”?
为什么i和j更改为默认值,而n仍然保持不变?静态变量/块在显示时执行/初始化(通常) 您的输出及其原因: 加载类时,在初始化过程中,将执行以下行
construct block
1: i=0 n=99t1
construct block
2: i=1 n=100t2
static construct block
construct block
1: i=0 n=101initl
这反过来会创建新的测试对象,但由于该类已经在初始化中,因此不会再次执行上面的行
所以
你得到
public static test t1 = new test("t1");
public static test t2 = new test("t2");
接下来,执行静态块
construct block
1: i=0 n=99t1
construct block
2: i=1 n=100t2
现在,当您在main()
中创建一个测试对象时,您将
static construct block
当这个类(实际上应该有一个大写的名称)被加载时,静态初始值设定项会按照它们在源代码中出现的顺序被调用。这意味着
新测试(“t?”)
对象创建发生在显式静态块之前。我知道你的意思,第一次创建t1时,公共静态int I=0;公共静态int j=i;将被执行,并且当t2正在创建时,这两行将不再执行。但是为什么test1创建这两行时会再次执行?(因为i和j更改为默认值)这是我不理解的。创建t1或t2时,public static int
行根本不会执行。由于它们是静态的,所以在加载类文件时会执行它们。静态字段和方法与对象实例根本不相关,不应该链接到“创建实例时”之类的内容。当我尝试“publicstaticinti=3”时,我知道当“newtest(t?)”I和j时,t?正在使用,默认值为0。感谢您的帮助!
construct block
1: i=0 n=101initl