如果这是多余的,我深表歉意,但我找不到类似的问题。而且,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
字段之后)。