public class Test { 行1
public static Test t = new Test("a"); 行2
public int i = print(2); 行3
{ 行4
System.out.println("构造块"); 行5
} 行6
public Test(String str){ 行7
System.out.println("构造块"+str); 行8
} 行9
static 行10
{ 行11
System.out.println("静态块"); 行12
} 行13
public static int print(int i){ 行14
System.out.println("print: "+i); 行15
return i; 行16
} 行17
public static void main(String args[]){ 行18
Test t=new Test("b"); 行19
} 行20
} 行21
构造块 (结果:2)
构造块a (结果:3)
静态块 (结果:4)
print: 2 (结果:5)
public static Test t = new Test("a"); 行2
public int i = print(2); 行3
{ 行4
System.out.println("构造块"); 行5
} 行6
public Test(String str){ 行7
System.out.println("构造块"+str); 行8
} 行9
static 行10
{ 行11
System.out.println("静态块"); 行12
} 行13
public static int print(int i){ 行14
System.out.println("print: "+i); 行15
return i; 行16
} 行17
public static void main(String args[]){ 行18
Test t=new Test("b"); 行19
} 行20
} 行21
结果:
print: 2 (结果:1)构造块 (结果:2)
构造块a (结果:3)
静态块 (结果:4)
print: 2 (结果:5)
构造块 (结果:6)
构造块b (结果:7)
如果没有 行19 结果1-4 会输出,因为java 在对代码进行编译的时候,对静态代码进行初始化。
当调用new创建对象时,会先初始化class非静态变量,然后调用本类构造方法,所以在初始化 t 时,先调用print方法初始化非静态变量i,然后每次调用构造方法,都会先调用
构造块 代码,然后调用静态块(只调用一次)。
执行顺序:静态块 构造块 非静态变量 构造函数
对于静态块和静态属性或者非静态块和属性,初始化顺序决定于它们在代码中的顺序。