Java中的静态块与初始化器块?

Java中的静态块与初始化器块?,java,static-block,initialization-block,Java,Static Block,Initialization Block,可能重复: 考虑以下代码: 我们知道首先执行静态块,然后执行空块。但问题是,我一直无法理解空块的真正效用。有人能举一个真实的例子吗- 同时使用静态块和空块 静态块和空块都有不同的实用程序 它们有两个截然不同的用途: 静态初始值设定项块将在类加载时被调用,并且将无法访问实例变量或方法。根据@Prahalad Deshpande的评论,它通常用于创建静态变量 另一方面,非静态初始值设定项块仅在对象构造上创建,将有权访问实例变量和方法,并且(根据@EJP建议的重要更正)将在调用超级构造函数(显式

可能重复:

考虑以下代码:

我们知道首先执行静态块,然后执行空块。但问题是,我一直无法理解空块的真正效用。有人能举一个真实的例子吗-

  • 同时使用静态块和空块
  • 静态块和空块都有不同的实用程序

它们有两个截然不同的用途:

  • 静态初始值设定项块将在类加载时被调用,并且将无法访问实例变量或方法。根据@Prahalad Deshpande的评论,它通常用于创建静态变量
  • 另一方面,非静态初始值设定项块仅在对象构造上创建,将有权访问实例变量和方法,并且(根据@EJP建议的重要更正)将在调用超级构造函数(显式或隐式)后在构造函数开始时调用在调用任何其他后续构造函数代码之前。我见过当一个类有多个构造函数并且需要为所有构造函数调用相同的初始化代码时使用它。与构造函数一样,您应该避免在此块中调用非final方法

请注意,这个问题在stackoverflow中已经回答了很多次,您最好搜索并查看类似的问题及其答案。例如:

每当加载类时,都会执行静态块。无论何时实例化类,都会执行空块。试着比较一下:

1.

public static void main(String[] args) {
    Test t = new Test();
}
public static void main(String[] args) {

}
2.

public static void main(String[] args) {
    Test t = new Test();
}
public static void main(String[] args) {

}

产出:

1.

public static void main(String[] args) {
    Test t = new Test();
}
public static void main(String[] args) {

}
静态块
空块

2.

public static void main(String[] args) {
    Test t = new Test();
}
public static void main(String[] args) {

}
静态块


用外行的话来说,静态块只被调用一次,不管你创建了多少个这种类型的对象。

OP
从来都不能理解空块或静态块的“真正效用”。@asgs“真正效用”是它们的行为不同,正如这个答案所描述的那样。@EJP对,我猜OP all想要看到的是一个真实的例子,例如,在公共库甚至JDK中使用的东西。@arshaji我刚刚尝试了你的例子,发现第二个例子不执行静态块,除非我实例化它。@arshaji你能通过加载一个类来澄清它的意思吗?我试图理解在没有构造函数帮助的情况下初始化静态最终变量的时间。我在这里提到了我的疑问:如果你能在这方面帮助我,那就太好了。此外,需要注意的是,静态块对于实例化静态类级变量(将在多个类实例之间共享的变量)非常有用。@Prahalad:good point。谢谢。匿名初始值设定项是在构造函数期间调用的,而不是在构造函数之前调用的。具体地说,在super()调用之后,@EJP:这是非常重要的信息,需要在我的答案中进行修改。非常感谢您的更正!!!非静态块对于初始化匿名类的字段也很有用,因为它不能有构造函数(匿名)。一个“空”块将。。不包含任何内容。使用更合适的术语有帮助。@Anshu你检查过这个吗:?是的,我检查过这个,它与下面答案中提到的链接相同。请看那边,超级解释: