【发布时间】:2014-12-24 05:18:36
【问题描述】:
我发现了很多关于静态初始化块的帖子,但是我试图更好地了解执行顺序及其原因。下面的代码打印出两个静态块中的文本,“然后”打印出主静态块中的文本。
我理解编译器调用它的方式是在加载类时按顺序执行所有静态块,然后访问 main 方法。但是由于主要方法本身是静态的,为什么不按其他静态块的顺序执行它(甚至不确定它是否有用,只是试图理解一个概念,以及是否有紧迫的理由这样做)。如果我们想在主块之后运行静态块怎么办?
class Cat {
static
{
System.out.println("This block welcomes you first");
}
public static void main(String[] args)
{
System.out.println("Meow world ");
}
static
{
System.out.println("This block welcomes you after");
}
}
实际输出
This block welcomes you first
This block welcomes you after
Meow world
为什么不呢?
This block welcomes you first
Meow world
This block welcomes you after
【问题讨论】:
-
因为静态块的代码在加载类之后调用它的main方法之前立即执行
-
不要混淆
static方法 和static初始化块。 -
我认为这回答了我的问题。 main 仍然是一个静态的“方法”,而其余的是初始化块。它们在类加载时运行而不被调用。所以这些块出现在哪里并不重要(在 main 之前或之后——它们总是在类加载后首先运行)
-
@aparna - 对。但请记住,静态初始化程序是按顺序执行的,即它们的出现方式和方式。
-
"如果我们想在主块之后运行一个静态块怎么办?"那将是一个终结器块,而不是一个初始化器块。您可以添加一个关闭挂钩(请参阅stackoverflow.com/questions/5747803/…),或在 main 方法中添加一个
try...finally语句。