Deitel的如何编写Java书籍说:
如果在声明中将final字段初始化为值,则也应将其声明为static。
为什么?
public class A
{
private final int x = 5;
private static final int y = 5;
}
我认为x和y是相同的
static
限定符在这里有什么用处?
static
限定符用于软件工程观察的优势是什么?
答案 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
c1
和c2
共享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个变量副本。如果要为非静态变量创建一个新实例,它将为该指定实例创建一个新副本。
由于它们是最终的,因此无法更改,因此将它们设置为静态是有意义的,因此当您创建新实例时,不会为变量分配任何新内容,因为它们甚至无法更改。