我正在尝试使用像这样的静态块:
我有一个叫做 Base.java
Base.java
public class Base { static public int myVar; }
和派生类Derived.java:
Derived.java
public class Derived extends Base { static { Base.myVar = 10; } }
我的main功能是这样的:
main
public static void main(String[] args) { System.out.println(Derived.myVar); System.out.println(Base.myVar); }
这0 0按我的预期打印输出10 0。有人可以解释这种行为吗?另外,如果我希望派生类为静态变量设置值,该如何实现?
0 0
10 0
我认为。您不调用任何Derived属性(myVar属于Base,不属于Derived)。而且Java没有从运行静态块Derived。如果向其中添加一些静态字段Derived并对其进行访问,则Java将执行所有静态块。
Derived
myVar
Base
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节)。
12.4.1何时发生初始化在以下任何一种首次出现之前,将立即初始化类或接口类型T:
•T是一个类,并创建T的实例。 •T是一个类,并调用T声明的静态方法。 •分配了由T声明的静态字段。 •使用T声明的静态字段,并且该字段不是常量变量(第4.12.4节)。 •T是顶级类(第7.6节),并执行词法嵌套在T中的断言语句(第14.10节)(第8.1.3节)。