初始化程序块 - 这段代码的流程是什么?

问题描述 投票:0回答:1

我知道下面的代码是允许的(我已经阅读了之前关于该主题的帖子),但是有人可以向我解释一下这个类运行时实际发生了什么吗?是否跳过块,然后在第 7 行初始化“i”,然后运行块(将“i”设置为 3),然后运行第 7 行,将“i”设置为 2?

public class TestClass {

    {
        i = 3;
    }

    int i = 2;      //LINE 7


}
java initialization instance-variables forward-reference
1个回答
0
投票

如果我们查看类的字节码:

/ class version 62.0 (62)
// access flags 0x21
public class org/kablambda/TestClass {

  // compiled from: TestClass.java

  // access flags 0x0
  I i

  // access flags 0x1
  public <init>()V
   L0
    LINENUMBER 3 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
   L1
    LINENUMBER 6 L1
    ALOAD 0
    ICONST_3
    PUTFIELD org/kablambda/TestClass.i : I
   L2
    LINENUMBER 9 L2
    ALOAD 0
    ICONST_2
    PUTFIELD org/kablambda/TestClass.i : I
    RETURN
   L3
    LOCALVARIABLE this Lorg/kablambda/TestClass; L0 L3 0
    MAXSTACK = 2
    MAXLOCALS = 1
}

我们看到代码的运行顺序与它在源代码中出现的顺序相同,所以首先将

i
设置为3,然后将
i
设置为2.

© www.soinside.com 2019 - 2024. All rights reserved.