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

时间:2009-04-28 13:35:42

标签: java static jvm

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

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

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

使用静态字段背后的缺点通常是什么?

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

4 个答案:

答案 0 :(得分:66)

静态并不意味着“由所有实例共享” - 它意味着“根本不与特定实例相关”。换句话说,您可以在A类的静态字段中获取任何实例。

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

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

答案 1 :(得分:2)

不鼓励使用静态方法和成员,因为它们经常被误用,但这听起来像静态是正确的方法。对于跨多个程序共享的静态,情况并非如此。每个程序都在完全独立的环境中运行。

答案 2 :(得分:-1)

您要找的是Singleton Pattern

答案 3 :(得分:-1)

假设所有内容都在同一个类加载器中,那么为什么不使用monostate模式来执行此操作?

您的共享静态隐藏在monostate中:


  public class Monostate {

      private static String str = "Default";

      public String getString() {
          return str;
      }

      public void setString(String s) {
          str = s;
      }
  }

然后你可以自由地创建任意数量的monostate实例,但是由于静态引用,它们都共享相同的底层对象。

   Monostate mono = new Monostate();
   mono.setString("Fred");
   System.out.println(mono.getString());