2014-08-29 49 views
0
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"); 
} 
} 

运行后:java类初始化的顺序,它是如何工作的?

construct block 
1: i=0 n=99t1 
construct block 
2: i=1 n=100t2 
static construct block 
construct block 
1: i=0 n=101initl 

谁能告诉我它是如何工作的? 为什么t1和t2 ware创建时没有“静态构造块”? 为什么我和j更改为默认值,但n仍然保持不变?

+0

[在Java中使用静态关键字创建对象]可能的重复(http://stackoverflow.com/questions/24927401/creating-object-using-static-keyword-in-java) – 2014-08-29 06:07:26

回答

5

静态变量/块被执行/初始化,因为它们出现(通常)。

你的输出和为什么? :

当把类装载和其初始化期间,下面的线将被执行

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 

接下来,静态块执行

static construct block 

现在,当您在main()创建测试的对象,你将有

construct block 
1: i=0 n=101initl 
+0

我知道你的意思,第一个时间t1已创建, – zawdd 2014-08-29 06:33:46

+0

public static int i = 0; public static int j = i;将被执行,并且t2创建时,这两行不会再执行。但为什么当test1创建这两行再次执行?(导致我和j改变为默认值)这是我不明白。 – zawdd 2014-08-29 06:36:19

+0

完全创建t1或t2时,不会执行'public static int'行。因为它们是静态的,所以在加载类文件时执行它们。静态字段和方法根本与对象实例无关,不应链接到任何类似“创建实例时”的东西。 – Korashen 2014-08-29 06:49:02

2

当这个类(它实际上应该有一个大写的名字)被加载时,静态初始值设定项会按它们出现在源代码中的顺序被调用。这意味着new test("t?")对象创建发生在显式静态块之前。