为什么要在初始化新的非静态对象时使用静态声明



如果这是多余的,我深表歉意,但我找不到类似的问题。而且,TBH,我什至不知道如何正确构建问题。

这是来自Java 8 OCA学习指南的复习问题。问题是关于静态初始值设定项的,我理解得很好。然而,有一行代码我没有得到,而且因为问题不是关于它的,所以没有一个很好的解释。

private static Rope rope = new Rope();

所以这与单例或静态类无关。我不明白你为什么要初始化这样的对象。而且,如果有充分的理由说明您可以并且愿意这样做,那么原因是什么?

有人可以指给我解释的方向吗?就像我说的,我什至不确定这叫什么,所以我很难自己找到一个好的答案。


编辑以放入整个类:

import rope.*;
import static rope.Rope.*;
public class RopeSwing
{
private static Rope rope1 = new Rope("rope 1");
private static Rope rope2 = new Rope("rope 2");
{
System.out.println(rope1.length);
}
public static void main(String[] args) {
rope1.length = 2;
rope2.length = 8;
System.out.println(rope1.length);
}
}

这使得单个Rope实例可供整个类使用 - 它将由声明此类的所有实例共享。当存在一些共享信息或所有实例都应依赖的状态时,这可能很有用。

通常,private static字段也被声明为final,这使它们成为常量(假设字段的类型是不可变的)。看看你的完整例子,我怀疑作者应该把它们private static final

.例如:

public class Foo {
private static Rope rope = new Rope();
private int value;
public Foo(int value) { this.value = value; }
@Override public String toString() {
return "static rope: " + rope + " instance value: " + value;
}
}

如果创建多个Foo实例(new Foo(1);、'new Foo(2)等),它们将共享同一个rope实例,并且new Rope()只会被调用一次(首次加载类时)。


非常量静态字段的一个示例可能是共享计数器。假设您希望在应用程序中的任何位置唯一标识构造对象的每个实例。你可以用一个AtomicInteger来做到这一点,它本质上是一个线程安全的int

public class Unique {
// despite being final this is not a "constant" because it's mutable
private static final AtomicInteger counter = new AtomicInteger();
private final int id;
public Unique() {
id = counter.getAndIncrement();
}
@Override public String toString() { return "ID: " + id; }
}

试一试 -Unique的每个实例都有一个唯一的 ID。

在您的示例代码中,有一个实例初始值设定项

,将在创建新实例时调用该初始值设定项(因此在初始化static字段之后)。

最新更新