静态初始化程序块和常规静态初始化之间的区别

正如标题所说,究竟是什么区别

public static String myString = "Hello World!"; 

 public static String myString; static { myString = "Hello World"; } 

除了结构之外还有什么重要的区别吗?

对于你的例子,没有区别。 但正如你所看到的,

 public static String myString = "Hello World!"; 

只能接受一个表达式来初始化变量。 但是,在静态初始化程序 (JLS 8.7)中,可以执行任意数量的语句。 例如,可以这样做:

 static { myString = "Hello"; myString += " "; myString += "World"; } 

对于您的示例,显然没有必要这样做,但是变量的初始化可能不仅仅是表达式,也许是许多语句,因此Java创建了静态初始化程序。

静态{…}块使您有机会在字段声明中执行更多操作。

例如,您可以填写地图的一些细节:

 private static final Map data = new HashMap(); static { data.put("A", "Hello"); data.put("B", "There"); data.put("C", "You"); } 

有时您可能还需要在实例化之前获取数据(来自文件,数据库等):

 public class Foo { private static final Person person; static { InputStream personData = Foo.class.getResourceAsStream("something.txt"); person = new Person(personData); } ... } 

静态初始化程序块和常规静态初始化之间的区别。

在变量初始化的情况下两者都是相同的。

但是,如果我们只想连接一次数据库或要加载一次的任何操作。 然后在静态块中编写代码,因为无论您创建的类型对象有多少,它在第一个类加载时只执行一次。

编辑:

您还可以构造一个类似的块:

 { // Do Something... } 

例:

 public class Demo { static{ System.out.println("Static"); } { System.out.println("Non-static block"); } public static void main(String[] args) { Demo demo = new Demo(); Demo demo2 = new Demo(); } } 

输出:

静态的

非静态块

非静态块

好吧,在您的第一个示例中,变量在同一行上声明并初始化。 在您的第二个变量首先被声明,然后初始化。 在第二种情况下,您可以在到达相关的初始化块之前进行任意数量的其他静态变量和块初始化。 考虑这种情况:

 public static String myString = "Hello World!"; public static String yourString = myString; static { System.out.println(myString); System.out.println(yourString); } 

VS:

 public static String myString ; public static String yourString = myString; static { myString = "Hello World"; } static { System.out.println(myString); System.out.println(yourString); } 

第一个例子的输出:

你好,世界
你好,世界

第二个例子的输出:

你好,世界
空值

使用静态块,您可以将初始化的顺序更改为与声明顺序不同。

为了继续Scott Stanchfield编写的内容,您可以使用Collections.unmodifiableXXX()方法来保证安全,尽管像Google Guava这样的库可能不那么必要。 考虑:

 public static final Map CAPITALS; static { Map map = new HashMap<>(); //Java 7. map.put("NY", "Albany"); map.put("MD", "Annapolis"); map.put("VA", "Richmond"); map.put("CT", "Hartford"); // 46 more states CAPITALS = Collections.unmodifiableMap(map); } 

当然,拥有52行静态块可能会让人迷失方向,因此您可能会将静态块转换为静态方法。

 public static final Map CAPITALS = capitals(); private static Map capitals() { Map map = new HashMap<>(); //Java 7. map.put("NY", "Albany"); map.put("MD", "Annapolis"); map.put("VA", "Richmond"); map.put("CT", "Hartford"); // 46 more states return Collections.unmodifiableMap(map); } 

区别在于风格问题。 您可能只需使用数据库表。

静态变量存储在其定义的类的所有实例(或非实例)之间共享的值。

静态块是在首次加载Class时执行的代码段。

“关于范围,静态块只能在同一个类中”,“而静态变量可以从任何类访问”

通常,静态变量的值在定义的类的所有实例(或非实例)之间共享,其中静态块是在首次加载Class时执行的代码段。 function上没有区别。