为什么数据字段应该是静态的和最终的

时间:2016-01-29 22:49:48

标签: java static final

Deitel的如何编写Java书籍说:

  

如果在声明中将final字段初始化为值,则也应将其声明为static。

为什么?

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

我认为x和y是相同的 static限定符在这里有什么用处?
static限定符用于软件工程观察的优势是什么?

5 个答案:

答案 0 :(得分:3)

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.b c1.a != c1.a。{/ p>

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

将{I}初始化的final变量声明为静态是明智的,因为它无法更改,因此只需一次分配内存即可。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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