Java中静态字段的确切含义是什么?
我想在同一类对象的各种实例之间共享一个对象。
从概念上讲,当我的程序运行时,类 A 的所有对象都访问类 B 的同一对象。
我已经看到它是系统范围的,并且不鼓励使用它。这是否意味着,如果我有另一个程序在相同的JVM上运行,实例化A类的对象,这些对象可能会访问与上一个程序中访问的对象相同的B对象?static
使用静态字段通常有哪些缺陷?
是否有任何替代方案(不需要花费大量实施工作)?
我想在同一类对象的各种实例之间共享一个对象。
从概念上讲,当我的程序运行时,类 A 的所有对象都访问类 B 的同一对象。
我已经看到它是系统范围的,并且不鼓励使用它。这是否意味着,如果我有另一个程序在相同的JVM上运行,实例化A类的对象,这些对象可能会访问与上一个程序中访问的对象相同的B对象?static
使用静态字段通常有哪些缺陷?
是否有任何替代方案(不需要花费大量实施工作)?
静态并不意味着“由所有实例共享” - 它意味着“与特定实例完全无关”。换句话说,您可以在不创建任何实例的情况下访问类 A 中的静态字段。
至于在同一个JVM中运行两个程序 - 这实际上取决于你所说的“运行两个程序”的确切含义。静态字段有效地与类对象相关联,而类对象又与类装入器相关联。因此,如果这两个程序使用单独的类装入器实例,您将有两个独立的静态变量。如果它们都使用相同的类加载器,则只有一个,因此它们将看到彼此的更改。
至于替代方案 - 有多种选择。一种是将对“共享”对象的引用传递给您创建的每个需要它的对象的构造函数。然后,它需要存储该引用以供以后使用。这可能有点痛苦,并且比静态方法消耗更多的内存,但它确实使可测试性变得容易。
不鼓励静态方法和成员,因为它们经常被误用,但这听起来像是静态是正确的方法。至于跨多个程序的静态共享,情况并非如此。每个程序都在完全独立的环境中运行。