静态初始化块和定期的静态初始化的区别(Difference between the static i

2019-07-21 21:23发布

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

public static String myString = "Hello World!";

public static String myString;

static {
    myString = "Hello World";
}

难道还有比结构之外的任何重要的区别?

Answer 1:

对于你的榜样,没有任何区别。 但正如你所看到的,

public static String myString = "Hello World!";

只能接受来初始化变量的表达式。 然而,在静态初始化 (JLS 8.7),可以执行任何数目的语句。 例如,它可以这样做:

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

对于你的榜样,有明显的没有必要做,但有可能为一个变量的初始化拿比的表达,也许很多语句的,所以Java做静态初始化。



Answer 2:

静态{...}块让你有机会做多,你就能够在场上声明做。

例如,你可以在地图上的一些细节填写:

private static final Map<String, String> data = new HashMap<String, String>();

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);
    }
    ...
}


Answer 3:

静态初始化块和定期的静态初始化之间的差异。

在变量初始化的情况下,两个相同。

但是,如果我们要与数据库只有一次连接或任何你想要的操作加载一次。 然后在静态块写代码,因为其只执行一次,当一级负荷无论你创建该类型的多少对象。

编辑:

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

{
    // 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();
    }
}

输出:

静态的

非静态块

非静态块



Answer 4:

那么,在你的第一个例子中,变量声明,并在同一行初始化。 在你的第二个变量被首次声明,然后初始化。 在第二种情况下,你可以有任意数量的其他静态变量和块初始化的让有问题的初始化块之前出现。 考虑这种情况下:

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);
}

从第一实施例的输出:

Hello World
Hello World

从第二实施例的输出:

Hello World
null


Answer 5:

静态块你可以改变声明的顺序不同的初始化的顺序。



Answer 6:

要继续什么斯科特Stanchfield写的,你可以使用Collections.unmodifiableXXX()方法的安全性,但像谷歌番石榴库可能会做出那么必要。 考虑:

public static final Map<String, String> CAPITALS;
static {
    Map<String, String> 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<String, String> CAPITALS = capitals();
private static Map<String, String> capitals() {
    Map<String, String> 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);
}

所不同的是风格问题。 你可能不是只是一个数据库表的工作。



Answer 7:

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

静态块是在第一次加载类时被执行的代码段。

“关于范围,静块是accssible仅在同一类”,“而静态变量可以从任何类访问”



Answer 8:

通常的静态变量的值是类的它是在其中一个静态块是在第一次加载类时被执行的代码段中定义的所有实例(或者非实例)之间共享。 在功能上没有区别。



文章来源: Difference between the static initializer block and regular static initialization