构造方法
构造方法
cinit()V
示例代码
public class CodeCinitTest {
static int i = 10;
static {
i = 20;
}
static {
i = 30;
}
public static void main(String[] args) {
System.out.println(i); // 30
}
}
编译器会按从上至下的顺序,收集所有 static 静态代码块和静态成员赋值的代码,合并为一个特殊的方法 cinit()V :
stack=1, locals=0, args_size=0
0: bipush 10
2: putstatic #3 // Field i:I
5: bipush 20
7: putstatic #3 // Field i:I
10: bipush 30
12: putstatic #3 // Field i:I
15: return
init()V
public class CodeInitTest {
private String a = "s1";
{
b = 20;
}
private int b = 10;
{
a = "s2";
}
public CodeInitTest(String a, int b) {
this.a = a;
this.b = b;
}
public static void main(String[] args) {
CodeInitTest d = new CodeInitTest("s3", 30);
System.out.println(d.a);
System.out.println(d.b);
}
}
编译器会按从上至下的顺序,收集所有 {} 代码块和成员变量赋值的代码,形成新的构造方法,但原始构造方法内的代码总是在后
Code:
stack=2, locals=3, args_size=3
0: aload_0
1: invokespecial #1 // super.<init>()V<init>":()V
4: aload_0
5: ldc #2 // <- "s1"
7: putfield #3 // -> this.a
10: aload_0
11: bipush 20 // <- 20
13: putfield #4 // -> this.b
16: aload_0
17: bipush 10 // <- 10
19: putfield #4 // -> this.b
22: aload_0
23: ldc #5 // <- "s2"
25: putfield #3 // -> this.a
// 原始构造方法在最后执行
28: aload_0
29: aload_1 // <- slot 1(a) "s3"
30: putfield #3 // -> this.a
33: aload_0
34: iload_2 // <- slot 2(b) 30
35: putfield #4 // -> this.b
38: return