Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java类初始化顺序,它是如何工作的?_Java_Class_Initialization - Fatal编程技术网

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