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

标签 java static jvm

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

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

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

使用静态字段通常有哪些缺陷?

是否有任何替代方案(不需要大量实现)?

最佳答案

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

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

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

关于java - Java中静态字段的确切含义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/797964/

相关文章:

java - 订阅 Microsoft Graph 推送通知时的状态代码 429

java - 使用 Selenium 的元素的存在

C++ 指针查询

android - 检查 RadioGroup 是否选中并获取静态 int 值

C++ 要求所有声明都有类型说明符

java - 不可思议的堆栈跟踪

java permGen内存不足错误tomcat-liferay服务器

java - 如何使用 wsdl url 创建 SOAP 消息?

java - SLF4J,通用日志记录,控制台输出

java - JVM是根据操作系统还是CPU架构来开发的?