静态最终vs一个实例最终何时以及为什么? Java面试问题

时间:2011-05-03 01:59:25

标签: java

假设我们有

final double pi = 3.14159
  • 我们是否应该将上述声明设为静态?

  • 当我们想要静态最终版本与实例最终版本时?

6 个答案:

答案 0 :(得分:2)

  1. 你应该让它最终是静态的。可能是公共或私人......但这是另一个讨论
  2. 一般情况下,静态韵母应该是常量或线程安全对象(例如不可变对象),您只需构造一次并在多个类实例中使用。
  3. 实例决赛是指您只在该实例中使用它,但(明智地)更愿意尽可能地减少您的状态可变性。
  4. 这两者不一定是矛盾的。例如,您可能有一个PasswordComplexityPolicy类。这需要一堆选项的构造函数,所有这些都是私有的最终实例。但是在课程的顶部,我们还有一个最终的公共静态PasswordComplexityPolicy DEFAULT_POLICY = new PasswordComplexityPolicy(构建所需的所有东西)。因为它是线程安全的,其他消费者可能会选择使用这种预先构建的策略而不是构建自己的策略。对他们有好处!

答案 1 :(得分:1)

静态变量绑定到类,因此它们只创建一次,并且只在内存中使用一个点。对于像PI这样的通用常量,这是完美的。

实例变量是对象实例的一部分,因此每个对象存储一次。 但请注意,最终变量不需要在代码中指定其值。它们可以在构造函数中完美地计算。因此,当常量特定于对象的实例时,它们很有用。 (比方说,你有一个Character对象在创建过程中从文件中读取它的移动速度,但之后的速度永远不会改变)

答案 2 :(得分:0)

静态final用于常量,如您显示的示例。 Instance final用于不可变类。

答案 3 :(得分:0)

在加载类时初始化静态final(保留在内存中),而每次创建实例时初始化实例final。所以对于这种情况,静态最终会更合适。

答案 4 :(得分:0)

由于pi永远不会改变,所以你应该在这里使用静态final。当它被定义为构造函数的一部分并且在编译时不知道时,您将使用实例final。如果它始终是相同的值并且在编译时已知,则它应该是静态最终值。

答案 5 :(得分:0)

当您只需要一个常量副本时,请使用static。如果您需要每个班级实例的副本,请不要使用static