gpt4 book ai didi

java - 在 Java 语言中以一种或另一种方式初始化静态变量的正确方法或根本区别是什么?

转载 作者:行者123 更新时间:2023-12-03 23:21:40 25 4
gpt4 key购买 nike

我对初始化静态变量的正确方法有点怀疑。

我意识到我可以在定义时直接为 static 变量赋值,如下所示:

public class MyClass {
// Direct initialization
public static int counter = 0;

此外,我发现您可以使用 static block ,例如:

public class MyClass {
public static int counter;

static {
counter = 0;
}
}

甚至,我惊讶地发现您还可以从类构造函数访问static 变量并从那里为它们设置一个值,如下所示:

public class MyClass {
public static int counter;

public MyClass() {
this.counter = 0;
}

public MyClass( int a ) {
this.counter = a;
}
}

我的问题是:处理静态变量时使用一种或另一种类型的初始化的正确方法或根本区别是什么?

我还编写并执行了以下代码,这样我就可以了解变量在程序执行过程中是如何被修改的。

public class StaticVariable {
static int a = 0;

public StaticVariable( int b ) {
// The constructor parameter b is ignored
System.out.println( "[Inside 1-parameter constructor] Current value of \"a\": " + a + " ." );
System.out.println( "[Inside 1-parameter constructor] Value of \"a\" was increased in one ..." );
a++;
}

public StaticVariable() {
System.out.println( "[Inside parameterless constructor] Current value of \"a\": " + a + " ." );
System.out.println( "[Inside parameterless constructor] Value of \"a\" was increased in one ..." );
a++;
}

static {
System.out.println( "[Inside static block] Initial value of \"a\": " + a + " ." );
System.out.println( "[Inside static block] Value of \"a\" was increased in one ..." );
a++;
}

public static void main( String[] args ) {
System.out.println( "[main method] Current value of \"a\": " + StaticVariable.a + " ." );
StaticVariable object = new StaticVariable();
System.out.println( "[main method] Current value of \"a\": " + StaticVariable.a + " ." );
StaticVariable object2 = new StaticVariable( 10 );
System.out.println( "[main method] Current value of \"a\": " + StaticVariable.a );
System.out.println( "[main method] Directly setting value of \"a\" with 560" );
StaticVariable.a = 560;
System.out.println( "Updated value of \"a\": " + StaticVariable.a );
}
}

提前致谢。

最佳答案

简短回答:如果您需要使用静态 block ,则仅使用它们。

在前两个示例中,没有语义或性能差异,编写代码的正确方法是简单的方法。

第三个示例在语义上有所不同。 setter 实际上并未初始化静态变量。它正在重新初始化变量。 (您可以在调用 setter 之前调用 getter,这将显示真实初始值;即零。)

使用 setter 没有任何问题(按照你的第三个例子),但它做了一些不同的事情。如果您只想对固定值进行简单的初始化,请不要这样做。用简单的方法来做吧。

(最后一个示例似乎不太合适,所以我将忽略它。)

在某些情况下,不可能在单个表达式中执行必要的初始化。 (例如,可能需要执行一系列语句来填充对象,或者捕获并处理异常,或者处理相互引用的 final 对象1 .) 在这些情况下,static block 是一种可能的解决方案。


前两种方法之间是否存在“根本区别”?

我不这么认为。

static Foo foo = <expression>;   // where this is legal Java code

在语义上 100% 等同于:

static Foo foo;
static {
foo = <expression>;
}

只是有些事情可以使用静态 block 完成,而使用简单的初始化程序则无法完成。静态 block 可能比单个赋值语句更复杂。


1 - 我对这里的术语“宽松”。实际上,final 是变量,而不是对象。

关于java - 在 Java 语言中以一种或另一种方式初始化静态变量的正确方法或根本区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61585003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com