小编典典

具有继承的静态块的行为

java

我正在尝试使用像这样的静态块:

我有一个叫做 Base.java

public class Base {

    static public int myVar;

}

和派生类Derived.java

public class Derived extends Base {

    static
    {
        Base.myVar = 10;
    }
}

我的main功能是这样的:

public static void main(String[] args)  {
    System.out.println(Derived.myVar);
    System.out.println(Base.myVar);
}

0 0按我的预期打印输出10 0。有人可以解释这种行为吗?另外,如果我希望派生类为静态变量设置值,该如何实现?


阅读 211

收藏
2020-09-18

共1个答案

小编典典

我认为。您不调用任何Derived属性(myVar属于Base,不属于Derived)。而且Java没有从运行静态块Derived。如果向其中添加一些静态字段Derived并对其进行访问,则Java将执行所有静态块。

class Base {

    static public int myVar;

}


class Derived extends Base {

    static public int myVar2;

    static
    {
        Base.myVar = 10;
    }
}


public class Main {
    public static void main( String[] args ) throws Exception {
        System.out.println(Derived.myVar2);
        System.out.println(Base.myVar);
    }
}

根据Java规范,当类初始化时(并执行了静态块):

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

•T是一个类,并创建T的实例。
•T是一个类,并调用T声明的静态方法。
•分配了由T声明的静态字段。
•使用T声明的静态字段,并且该字段不是常量变量(第4.12.4节)。
•T是顶级类(第7.6节),并执行词法嵌套在T中的断言语句(第14.10节)(第8.1.3节)。

2020-09-18