构造方法

构造方法

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

posted @ 2023-05-27 21:44  小陈code  阅读(10)  评论(0)    收藏  举报