我知道下面的代码是允许的(我已经阅读了之前关于该主题的帖子),但是有人可以向我解释一下这个类运行时实际发生了什么吗?是否跳过块,然后在第 7 行初始化“i”,然后运行块(将“i”设置为 3),然后运行第 7 行,将“i”设置为 2?
public class TestClass {
{
i = 3;
}
int i = 2; //LINE 7
}
如果我们查看类的字节码:
/ 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.