【发布时间】:2016-02-21 16:00:03
【问题描述】:
我有一个关于静态块的问题:
假设我有一个如下所示的课程:
class SomeClass {
static {
System.out.println("static block");
}
}
我在某处定义了一个SomeClass 类型的变量。
public static void main(String args[]) {
SomeClass foo;
}
现在我认为静态块会被执行,但事实并非如此。据我所知,只要类加载器加载SomeClass 类,就会执行静态块。现在是我真正的问题:
不是在我定义了该类型的变量后就加载了该类吗?。如果是,为什么不执行静态块?
如果答案是否定的,那么我怎么知道类加载器是否已经加载了一个类以及加载该类的不同可能性(我知道 2:初始化变量和使用静态字段/方法)
【问题讨论】:
-
编译器可以删除 foo,在这种情况下是 SomeClass 的导入。
Class.forName("... SomeClass")确实初始化了类。 -
@JoopEggen 啊好的,但是编译器不能在初始化但从未使用过的 foo 时也删除它吗?还是编译器永远不会这样做?
-
编译器(和运行时)延迟加载类直到需要它们是一种常见的优化。 import 语句是编译器的指令,但不会在运行时执行。我见过这样的环境,只有在执行引用该类的方法时才加载类,而不是在执行不引用该类的其他方法时加载。
-
Class.forName 重载了一个布尔参数来初始化 class;默认为真。初始化 变量 可能足以调用类加载和初始化,即使整个对象都被优化掉了。应该考虑(理想情况下)有不止一个 java 编译器。
-
@ParkerHalo 是的。一个天真的编译器不会删除未使用的变量。
标签: java static-block