静态初始化块
据我所知,“静态初始化块”用于设置静态字段的值,如果不能在一行中完成的话。
但我不明白为什么我们需要一个特殊的块。例如,我们将一个字段声明为静态(没有值赋值)。然后编写几行代码,生成并为上面声明的静态字段赋值。
为什么我们需要在一个特殊的块中使用这些行:
static {...}
?
没有找到相关结果
已邀请:
13 个回复
棠媳鳖
每次构造类的实例时都会调用它。无论您创建的类型对象有多少,静态块只会在类本身被初始化时被调用一次。 例:
这打印:
联课
如果
和
不在一个区块中,它们看起来就像是田地。如果它们位于前面没有
的块中,那么它将被视为实例初始化块而不是静态初始化块,因此每个构造实例将执行一次,而不是总共执行一次。 现在在这种特殊情况下,您可以使用静态方法:
...但是当您希望在同一个块中分配多个变量时,这不起作用,或者没有(例如,如果您只想记录某些内容 - 或者可能初始化本机库)。
徘廷
“静态”部分中的代码将在类加载时执行,然后构造类的任何实例(并且在从其他地方调用任何静态方法之前)。这样您就可以确保类资源都可以使用了。 也可以使用非静态初始化程序块。这些行为类似于为类定义的构造函数方法的扩展。它们看起来就像静态初始化块一样,除了关闭“static”关键字。
抢垢洛韧
嘿,还有另一个好处,你可以用它来处理异常。想象一下,
在这里抛出一个真正属于catch块的
:
那么
初始化器在这里很有用。你可以在那里处理异常。 另一个例子是事后做的事情,在分配期间无法完成:
回到JDBC驱动程序示例,任何体面的JDBC驱动程序本身也使用
初始化程序在
中注册自己。另见这个和这个答案。
盛梯獭八搽
只是语法糖。你不能用
块做任何事情而不能做任何其他事情。 重复使用这里发布的一些例子。 这段代码可以在不使用
初始化程序的情况下重写。 方法#1:用
方法#2:没有
凡夕
成员 使用计算值初始化
成员 人们倾向于使用
块作为初始化类在运行时内所依赖的东西的便捷方式 - 例如确保加载特定类(例如,JDBC驱动程序)。这可以通过其他方式完成;但是,我上面提到的两件事只能通过像
块这样的结构来完成。
擅香
炬卤遁蝎变
这里初始化器用于维护索引(
),将一组别名映射回原始枚举类型。它旨在作为
本身提供的内置valueOf方法的扩展。 如您所见,静态初始化程序甚至可以访问
字段
。重要的是要理解
块已经可以访问
值实例(例如
)。这是因为在
类型的情况下初始化和执行的顺序,就像在调用
块之前已经用实例初始化了
字段:
常量是隐式静态字段。这需要Enum构造函数和实例块,并且首先也要进行实例初始化。
按发生顺序阻止和初始化静态字段。 这个无序初始化(
块之前的构造函数)非常重要。当我们使用类似于Singleton的实例初始化静态字段时也会发生这种情况(简化):
我们看到的是以下输出:
清楚的是,静态初始化实际上可以在构造函数之前发生,甚至在: 只需在main方法中访问Foo,就会导致加载类并启动静态初始化。但是作为静态初始化的一部分,我们再次为静态字段调用构造函数,之后它恢复静态初始化,并完成从main方法中调用的构造函数。相当复杂的情况,我希望在正常编码中我们不必处理。 有关这方面的更多信息,请参阅“有效Java”一书。
膏焦凑
块非常有用。 例如,如果需要将静态成员设置为存储在配置文件或数据库中的值。 当您想要向静态
成员添加值时也很有用,因为您无法在初始成员声明中添加这些值。
谦响局豢报
2-有一个静态初始化块:
3-有一个访问类变量并初始化它的类方法(静态方法): 这是上述静态块的替代方案;你可以编写一个私有静态方法:
现在为什么要使用静态初始化块而不是静态方法? 这完全取决于您在程序中的需求。但是你必须知道静态初始化块被调用一次,而类方法的唯一优点是,如果你需要重新初始化类变量,它们可以在以后重用。 假设你的程序中有一个复杂的数组。你初始化它(例如使用for循环)然后这个数组中的值将在整个程序中改变,但是在某些时候你想要重新初始化它(回到初始值)。在这种情况下,您可以调用私有静态方法。如果你的程序中不需要重新初始化值,你可以使用静态块而不需要静态方法,因为你以后不会在程序中使用它。 注意:静态块按它们在代码中出现的顺序调用。 例1:
例2:
抽法
添加到静态块中。
它将保证在将相关库加载到内存之前不会调用本机方法。 根据oracle的loadLibrary: 如果使用相同的库名称多次调用此方法, 第二次和后续调用将被忽略。 所以非常出乎意料的是,放置System.loadLibrary并不是为了避免多次加载库。
替秀宝
对象。这是运行静态块的时候。所以你可以这样做:
它会打印“myInt is 1”到控制台。请注意,我没有实例化任何类。
眠皇
现在我的static int x将动态初始化..Bcoz当编译器将转到Solution.x时它将在类加载时加载解决方案类和静态块加载。因此我们能够动态初始化该静态数据成员.. }