为什么超类中的静态块/静态变量在main之前初始化?

阿林丹·萨哈(Arindam Saha)
public class sup {
    static {
        System.out.print("In Sup  ");
    }
}


public class sub extends sup {
    static {
        System.out.print("In Sub");
    }
}

final public class test extends sub {
    static int a = 10;

    static {
        System.out.print("  In test" + a);
    }

    {
        System.out.print("  In test" + a);
    }

    public static void main(String[] args) {

    }
}

输出:

In Sup  In Sub  In test10

但是这里我没有创建对象。JVM应该调用main方法,该方法是静态的,并且仅初始化main类。所以应该给输出In test10

谁能解释为什么我得到不同的输出?

穆雷尼克

static当类加载器加载类时,将调用初始化程序块。简而言之,执行顺序如下:

  1. 尝试加载test,取决于sub
  2. 尝试加载sub,取决于sup
  3. 尝试加载 sup
  4. sup已加载,并static打印"In Sup"
  5. sub恢复加载,并static打印"In Sub"
  6. test恢复加载,并将a其初始化为10
  7. teststatic块被执行并打印" In test10"
  8. testmain函数已执行,但没有执行任何操作,因为它为空。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章