静态初始化块

静态初始化块

据我所知,“静态初始化块”用于在一行中设置静态字段的值。

但是我不明白为什么我们需要一个特殊的障碍来解决这个问题。例如,我们将一个字段声明为静态字段(没有值赋值)。然后编写代码中的几行代码,生成并为上述声明的静态字段赋值。

为什么我们需要在一个特殊的块中使用这一行,比如:static {...}?


慕哥6287543
浏览 462回答 3
3回答

慕无忌1623718

这个非静态块:{     // Do Something...}获取调用每次构造类的一个实例。这个静态块只会被调用一次,当类本身被初始化时,不管您创建了多少个该类型的对象。例子:public class Test {     static{         System.out.println("Static");     }     {         System.out.println("Non-static block");     }     public static void main(String[] args) {         Test t = new Test();         Test t2 = new Test();     }}这些指纹:StaticNon-static blockNon-static block

凤凰求蛊

如果它们不在静态初始化块中,那么它们会在哪里?您将如何声明仅用于初始化目的本地变量,并将其与字段区分开来?例如,如何你,你们想写:public class Foo {     private static final int widgets;     static {         int first = Widgets.getFirstCount();         int second = Widgets.getSecondCount();         // Imagine more complex logic here which really used first/second         widgets = first + second;     }}如果first和second不是在街区里,它们看起来就像田野。如果他们在一个街区里static在它前面,这将被算作一个实例初始化块,而不是一个静态初始化块,因此它将被执行一次。每构造实例,而不是总计一次。现在,在这种特殊情况下,您可以使用静态方法来代替:public class Foo {     private static final int widgets = getWidgets();     static int getWidgets() {         int first = Widgets.getFirstCount();         int second = Widgets.getSecondCount();         // Imagine more complex logic here which really used first/second         return first + second;     }}..但是,如果您希望在同一个块中分配多个变量,或者没有变量(例如,如果您只想记录某项内容-或者可能初始化一个本机库),这是行不通的。

小唯快跑啊

下面是一个例子:&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;HashMap<String,&nbsp;String>&nbsp;MAP&nbsp;=&nbsp;new&nbsp;HashMap<String,&nbsp;String>(); &nbsp;&nbsp;static&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;MAP.put("banana",&nbsp;"honey"); &nbsp;&nbsp;&nbsp;&nbsp;MAP.put("peanut&nbsp;butter",&nbsp;"jelly"); &nbsp;&nbsp;&nbsp;&nbsp;MAP.put("rice",&nbsp;"beans"); &nbsp;&nbsp;}“静态”部分中的代码将在类加载时、类的任何实例被构造之前(以及在从其他地方调用任何静态方法之前)执行。这样,您就可以确保类资源都可以使用了。也有可能有非静态初始化块。它们类似于为类定义的构造函数方法集的扩展。它们看起来就像静态初始化程序块,除非关键字“静态”被关闭。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java