一尘不染

Java中静态字段的确切含义是什么?

java

我想在同一类对象的各种实例之间共享一个对象。

从概念上讲,在我的程序运行时,类A的所有对象都访问类B的相同对象。

我已经看到这static是系统范围的,不鼓励使用它。这是否意味着如果我在实例化类A的对象的同一JVM上运行另一个程序,则这些对象可能会访问与先前程序中访问的对象相同的B对象?

使用静态字段的一般缺陷是什么?

是否有其他选择(不需要大量的实施工作)?


阅读 512

收藏
2020-03-04

共1个答案

一尘不染

静态不是完全意味着“由所有实例共享”,而是“完全不与特定实例相关”。换句话说,您无需创建任何实例即可获得类A中的静态字段。

至于在同一个JVM中运行两个程序,这实际上取决于您“运行两个程序”的含义。静态字段有效地与类对象相关联,而类对象又与类加载器相关联。因此,如果这两个程序使用单独的类加载器实例,则将有两个独立的静态变量。如果他们都使用相同的类加载器,那么将只有一个,因此他们将看到彼此的更改。

至于替代方案-有多种选择。一种是将对“共享”对象的引用传递给您创建的每个需要它的对象的构造函数。然后它将需要存储该引用以供以后使用。与静态方法相比,这可能会有些痛苦并且占用更多的内存,但是确实可以简化测试。

2020-03-04