【问题标题】:Why should data fields be static and final为什么数据字段应该是静态的和最终的
【发布时间】:2016-05-07 20:02:51
【问题描述】:

Deitel 的 How To Program Java 书说:

如果 final 字段在其声明中被初始化为一个值,它也应该被声明为静态的。

为什么会这样?

public class A
{
   private final int x = 5;
   private static final int y = 5;
}

我认为 x 和 y 是一样的。
static 限定符在这里有什么意义?
static 限定词对软件工程观察有什么好处?

【问题讨论】:

  • static 仅表示您不需要类实例即可引用它。我不确定我是否完全同意该声明,但它脱离了上下文,因为您可以有一个 final 字段,该字段是从传递给类的构造函数的值初始化的,但也许这是一个不同的用例
  • 没错,只有这个区别吗?
  • “如果 final 字段在其声明中初始化为一个值,它也应该被声明为静态的。” 谁写过这应该区分可变类型和不可变类型。跨度>
  • 它们不一样。对于 n 个As,有 n 个 xs,只有 1 个 y
  • 我建议唯一的其他(显着)区别是如何为它们分配内存

标签: java static final


【解决方案1】:

x 是实例变量,而 y 是全局变量。

这是什么意思?

我们来看这个例子:

public class A {
    public A() {
        System.out.println("create A");
    }
}

public class B {
    public B() {
        System.out.println("create B");
    }
}

public class C {
    private static B b = new B();
    private A a = new A();
}

然后是一个主要的:

public static void main(String[] args) {
    C c1 = new C();
    C c2 = new C();
}

哪些打印:

> create B
> create A
> create A

c1c2 共享相同的 B 实例,同时它们都创建了自己的 A 实例!

所以c1.b == c2.bc1.a != c2.a

所以总结: 对于 C 类 (c1, c2) 的每个实例,字段 b 只有一个相同的位置/地址 但是对于字段 a,在不同的实例中有不同的地点/地址。

A 类和 B 类的示例有点过大: 即使对于简单的字段(int、float、...),对于类的每个实例中的静态字段来说,它也是一个相同的位置/出现。

【讨论】:

    【解决方案2】:

    由于它是最终的,它将始终保持相同的值。 如果你不声明它static,你将为你的类的每个实例创建一个变量。成为static 意味着您只声明变量一次,避免不必要的内存使用。

    【讨论】:

      【解决方案3】:

      将变量声明为静态的更节省内存。例如,在您的示例中,无论您创建多少次new A(),因为字段x 和字段y 已被声明为静态,它们只会被分配一次内存。如果你不将它们声明为static,它们将被分配给每个新类实例的内存。

      final 变量声明为像您的一样被初始化为静态是明智的,因为它无法更改,因此只分配一次内存是可以接受的。

      【讨论】:

        【解决方案4】:

        本质上是为了节省内存。如果常量无论如何总是相同的,那么您不妨将其设为静态,这样就不会为每个对象创建它。但是,如果每个对象的常量不一定相同(例如,如果您的常量在构造函数中的某处初始化),您希望将其设为静态。

        【讨论】:

        • "如果你的常量在构造函数的某个地方被初始化" 那么它就不再是一个常量
        • 嗯,它不是在所有对象中都保持不变,但对于初始化后的对象来说,它不变的(它的值不能更改)。
        【解决方案5】:

        它节省了内存,因为它只为变量的 1 个副本分配。如果您要为非静态变量创建一个新实例,它将为该指定实例创建一个新副本。

        由于它们是最终的,因此它们无法更改,因此将它们设为静态是有意义的,因此当您创建新实例时,不会为变量分配任何新内容,因为它们甚至无法更改。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-12-03
          • 2011-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-13
          相关资源
          最近更新 更多