我们知道java中的静态块在compliling时被重新调用,而不是在运行时。因此我们再次知道静态内部类在第一次调用嵌套类时被实例化。 现在假设嵌套类具有静态块。那么,在这种情况下,我们可以说当第一次尝试访问嵌套类时,嵌套类中的静态块会被解析吗? 示例代码:
public class A
{
public static class B
{
static A a;
static
{
a=new A();
}
public static A getA()
{
return a;
}
}
}
现在我正在访问: A = A.b.getInstance(); 我希望在那时只能执行B中的静态块而不是之前。
答案 0 :(得分:4)
这应该回答你的问题:
public class Test {
public Test() {
System.out.println("Test instantiated");
}
public static class Inner {
static {
System.out.println("Static block executed");
}
public Inner() {
System.out.println("Test.Inner instantiated");
}
}
}
致电:
Test test = new Test();
Test.Inner inner = new Test.Inner();
我们得到:
Test instantiated
Static block executed
Test.Inner instantiated
答案 1 :(得分:2)
java中的静态块在编译时被解析
不,不是。
所有静态代码在加载/初始化时由类加载器解析一次。
答案 2 :(得分:0)
来自jls Compile
时间错误仅在static blocks
时出现
If a static initializer cannot complete normally.
If a return statement appears anywhere within a static initializer.
If the keyword this or the keyword super or any type variable declared outside the static initializer, appears anywhere within a static initializer.
当课程为static block
时, initialized
将被执行,因此在您的示例中,static block
中的static class B
将首先执行。