静态内部类中的静态块

时间:2014-06-02 15:18:34

标签: java

我们知道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中的静态块而不是之前。

3 个答案:

答案 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将首先执行。