静态块初始化

uml*_*uml 4 java static instance

这是一段Java代码:

static {        
    ture = 9;       
}
static int ture;
{ // instance block 
    System.out.println(":"+ture+":");           
}
Run Code Online (Sandbox Code Playgroud)

它是如何编译的?初始化后已执行变量'ture'的声明.据我所知,静态块和字段按照它们出现的顺序执行.

现在为什么实例块中的值9已被打印3次?顺便说一下,类的实例已经创建了3次.这不是作业,我正在学习Java认证.

T.J*_*der 11

关于第一个问题,静态块确实按它们出现的顺序处理,但是在静态块之前首先处理声明.声明作为类的准备(JLS§12.3.2)的一部分进行处理,该声明在初始化之前发生(JLS§12.4.2).出于学习的目的,整个JLS§12可能是有用的,以及JLS§8,特别是第8.6节JLS§8.7.(感谢Ted Hopp并且对于调出这些部分而言并不具有信誉.)

引用的代码中没有足够的信息来回答您的第二个问题.(无论如何,在每个问题上最好问一个问题.)但是例如:

public class Foo {
    static {     
        ture = 9;   
    }

    static int ture;

    {   // instance block   
        System.out.println(":"+ture+":");

    }

    public static final void main(String[] args) {
        new Foo();
    }
}
Run Code Online (Sandbox Code Playgroud)

...只输出:9: 一次,因为只创建了一个实例.如果删除该new Foo();行,它根本不输出它.如果您看到:9:三次,那么您可能会在未显示的代码中创建三个实例.