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());