从抽象类派生的子类的静态块的执行

时间:2018-12-18 07:01:36

标签: java class abstract

public class Test15 {
    public static void main(String[] args) {
        System.out.println(B.x);
    }
}

abstract class A { 
    static int x=99;

    A() {
        System.out.println("A DC");
    }

    static {
        System.out.println("A SB");
    }
}

class B extends A {
    static {
        System.out.println("B Sb");
    }
}

为什么在上述程序中未执行子类静态块?

2 个答案:

答案 0 :(得分:4)

x是类static的{​​{1}}变量,因此即使您通过A访问它,也不需要初始化类B.x。因此,不会执行类B的{​​{1}}初始化程序。

以下是相关的JLS 12.4.1 quote

  

对静态字段的引用(第8.3.1.1节)仅导致实际声明它的类或接口的初始化,即使它可能是通过子类,子接口或实现的类的名称来引用的接口。

答案 1 :(得分:0)

B的静态块仅在初始化类B时执行。调用其超类x的领域A不会导致类B的初始化。

根据Java规范:

  

12.4.1发生初始化时

     

类或接口类型T将在以下任何一种首次出现之前立即初始化:

     

•T是一个类,并且创建了T的一个实例。

     

•T是一个类,并调用T声明的静态方法。

     

•分配了由T声明的静态字段。

     

•使用了由T声明的静态字段,并且该字段不是常量变量(第4.12.4节)。

     

•T是顶级类(第7.6节),并且执行了一个词法嵌套在T(第8.1.3节)中的断言语句(第14.10节)。