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

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

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

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

使用静态字段背后的缺点一般是什么?

有没有其他选择(不需要大量的实施)?

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

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

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

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

您正在寻找的是Singleton模式 。

假设一切都在同一个类加载器中,那么为什么不使用monostate模式来做呢?

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


  公共课Monostate {

       private static String str =“Default”;

       public String getString(){
          返回str;
       }

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

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

    Monostate mono = new Monostate();
    mono.setString( “弗雷德”);
   的System.out.println(mono.getString());