当前位置: 首页 > 面试题库 >

为什么说java中的静态变量尽量不要使用?

羊舌高爽
2023-03-14
问题内容

为什么说java中的静态变量尽量不要使用?


问题答案:

静态变量表示全局状态。这很难推理,也很难测试:如果创建对象的新实例,则可以在测试中推断其新状态。如果我使用的代码使用的是静态变量,则它可能处于任何状态-任何事情都可能对其进行修改。

我可以继续进行一段时间,但是要考虑的更大概念是,事物的范围越紧密,就越容易进行推理。我们善于思考小事情,但是如果没有模块化,就很难对一百万行系统的状态进行推理。顺便说一下,这适用于各种各样的事物-不仅是静态变量。

总结了在Java中使用静态方法的一些基本优点和缺点:

优点:

  1. 可全局访问,即不与任何特定对象实例绑定。
  2. 每个JVM一个实例。
  3. 可以通过使用类名来访问(不需要对象)。
  4. 包含适用于所有实例的单个值。
  5. 在JVM启动时加载并在JVM关闭时死亡。
  6. 他们不修改对象的状态。

缺点:

  1. 无论是否使用静态成员,静态成员始终是内存的一部分。
  2. 你无法控制静态变量的创建和销毁。有用的是,它们是在程序加载时创建的,并在程序卸载时(或在JVM关闭时)销毁。
  3. 你可以使用sync使statics线程安全,但是你需要付出额外的努力。
  4. 如果一个线程更改了静态变量的值,则该静态变量可能会破坏其他线程的功能
  5. 你必须先了解“静态”才能使用它。
  6. 你不能覆盖静态方法
  7. 序列化不适用于它们。
  8. 他们不参与运行时多态。
  9. 如果使用了大量的静态变量/方法,则存在内存问题(在某种程度上但我猜不是很多)。因为在程序结束之前不会收集它们。
  10. 静态方法也很难测试。


 类似资料:
  • 问题内容: java为什么不能从静态环境引用非静态变量? 问题答案: 你必须了解一个类与该类实例之间的区别。如果你在街上看到汽车,即使你看不到哪种型号或类型,也将立即知道它是汽车。这是因为你将看到的与“汽车” 类进行了比较。该类包含与所有汽车相似的类。可以将其视为模板或想法。 同时,你看到的汽车是“汽车”类的一个实例,因为它具有你期望的所有属性:有人驾驶它,它有引擎,车轮。 因此,该班级说“所有汽

  • 问题内容: 在C / C ++中,我们使用静态局部变量来维护方法的状态。但是,为什么Java不支持它呢? 是的,我可以为此使用一个静态字段。但是创建一个仅维护一个方法状态的字段有点奇怪吗? 问题答案: 您已经找到了唯一的解决方案。 Java放弃了C ++的许多复杂性,这就是其中之一。 作用于函数的静态变量并发地对您造成麻烦(例如,正是由于这个原因,strtok是与pthread一起使用的著名的讨厌

  • 问题内容: 我在这里阅读Threadlocal的JavaDoc https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ThreadLocal.html 它说:“ ThreadLocal实例通常是希望将状态与线程关联的类中的私有静态字段(例如,用户ID或事务ID)。” 但是我的问题是,为什么他们选择使其静态化(通常)-使其具有“每个线程”状态

  • 问题内容: 根据Java,静态变量可以通过类名访问,但是即使Java不建议使用静态变量,类对象也可以访问它们,并且给出相同的答案。 我知道该变量只有一个副本,并且所有对象和其他事物的值都相同。Java为什么建议使用类名而不是类对象? 问题答案: 因为可能会造成混淆!静态成员上没有动态调度。 看一下这个令人困惑的代码:(可能是语法错误;我的Java生锈了) 看起来很混乱,因为方法似乎是多态的,所以输

  • 问题内容: 我有一个带有静态实例的android java类,其中包含一个用户信息。但是,在极少数情况下,当用户使用我的应用程序时,该静态实例中的变量之一会在一段时间后变为null。该Java类是全局的(未附加到任何活动)。是什么原因造成的? 编辑:该变量永远不会更改,除非在应用程序启动期间。我已经检查过调用它的函数永远不会被调用一次以上(adb logcat证明了当我添加一条日志表明正在被调用时

  • 问题内容: 另外,在网上可以找到许多创建静态变量的解决方案。(尽管我还没有看到我喜欢的一个。) 为什么Python不支持方法中的静态变量?这被认为是非Python的,还是与Python的语法有关? 编辑: 我专门询问了 为什么 进行设计决策,但我没有提供任何代码示例,因为我想避免解释来模拟静态变量。 问题答案: 忽略这一点的想法是,静态变量仅在以下两种情况下才有用:何时真正应该使用类以及何时真正应