为什么在访问Child.name时没有执行Child类的静态块?

时间:2016-05-19 05:33:07

标签: java

我正在学习核心java中的静态块功能。

public class ClassResolution {
    static class Parent {
        public static String name = "Sparsh";
        static {
            System.out.println("this is Parent");
            name = "Parent";
        }
    }

    static class Child extends Parent {
        static {
            System.out.println("this is Child");
            name = "Child";
        }
    }

    public static void main(String[] args) throws ClassNotFoundException {
        System.out.println(Child.name);
    }
}

我认为输出将是:

this is Parent 
this is Child 
Child

但实际输出是:

this is Parent
Parent

我不明白为什么。

1 个答案:

答案 0 :(得分:14)

由于name是在Parent类中声明的静态字段,因此在main方法中访问它(即使使用Child类名作为前缀来访问它)导致Parent类被初始化。 Child类未初始化。

因此显示"this is Parent"(因为Parent的静态初始化程序块已执行),"this is Child" 显示(因为{的静态初始化程序段} {1}} 已执行)且Child的打印值为name

以下是相关的JLS参考:

  

12.4。类和接口的初始化

     

类的初始化包括执行其静态   初始化器和静态字段的初始化器(类变量)   在课堂上宣布。

     

接口的初始化包括执行初始化器   对于在接口中声明的字段(常量)。

     

12.4.1。初始化发生时

     

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

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

  •   
  • 调用T声明的静态方法。

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

  •   
  • 使用T声明的静态字段,该字段不是常量变量(§4.12.4)

  •   
  • T是顶级类(§7.6),并且执行词汇嵌套在T(§8.1.3)中的断言语句(§14.10)。

  •