【发布时间】:2012-09-01 07:00:57
【问题描述】:
在查看一些旧代码时,我发现了一些我以前从未见过的相当奇怪的语法。在做了一些研究之后,我现在知道我看到的是一个 static{} 块,它(如果我理解正确的话)是一个在初始化时执行的代码块。
我不明白拥有这样一个功能的优势,或者什么时候可能想要使用它。看起来静态块只包含可以属于任何常规静态方法的常规代码行,那么让它在初始化时自动运行有什么好处(除了为程序员节省一行代码调用方法)?为什么这很重要或有用?
【问题讨论】:
在查看一些旧代码时,我发现了一些我以前从未见过的相当奇怪的语法。在做了一些研究之后,我现在知道我看到的是一个 static{} 块,它(如果我理解正确的话)是一个在初始化时执行的代码块。
我不明白拥有这样一个功能的优势,或者什么时候可能想要使用它。看起来静态块只包含可以属于任何常规静态方法的常规代码行,那么让它在初始化时自动运行有什么好处(除了为程序员节省一行代码调用方法)?为什么这很重要或有用?
【问题讨论】:
正如他们在Java Tutorials 中所说的:
如果初始化需要一些逻辑(例如,错误处理或用于填充复杂数组的 for 循环),简单的赋值是不够的。实例变量可以在构造函数中初始化,其中可以使用错误处理或其他逻辑。为了为类变量提供相同的功能,Java 编程语言包含静态初始化块。
【讨论】:
正如您所说,静态块在初始化时执行。 假设您有一个可能非常复杂的静态字段,例如
private static List<ThingsDownloadedByTheNet> ls;
只是在做
private static List<ThingsDownloadedByTheNet> ls = new ArrayList<ThingsDownloadedByTheNet>
还不够,因为您可能还想设置列表元素。 所以,你做一个静态块,在其中你执行一些初始化(在这种情况下你连接到一个服务器并填充列表元素)
【讨论】:
将其视为静态变量的构造函数。它使您有机会在任何人使用它们之前对其进行初始化。
【讨论】:
static{} 块中操作final 变量。结合下面关于初始化复杂对象类型的答案,回答了这个问题。
static{} 块在加载类时执行。您可以使用它来初始化静态字段或调用静态方法。您不能使用任何方法来替换此行为,因为类“没有构造函数”。实际上,您可以将其视为“类构造函数”。
【讨论】:
private static final MY_VAR = someStaticMethod()。 (在类加载时执行)