在类中声明一个final
变量(常量),例如:
private static final int MyVar = 255;
如果有100,000个实例声明了这个类,那么这将需要多少内存?
它会将变量链接到类,因此具有1 * MyVar的存储器使用量(忽略内部指针),还是将链接到此变量的实例并创建100,000 * MyVar个副本的存储器使用量?
反应非常迅速!共识似乎是,如果一个变量既是静态的又是final的,则需要1 * MyVar的内存。谢谢大家!
在类中声明一个final
变量(常量),例如:
private static final int MyVar = 255;
如果有100,000个实例声明了这个类,那么这将需要多少内存?
它会将变量链接到类,因此具有1 * MyVar的存储器使用量(忽略内部指针),还是将链接到此变量的实例并创建100,000 * MyVar个副本的存储器使用量?
反应非常迅速!共识似乎是,如果一个变量既是静态的又是final的,则需要1 * MyVar的内存。谢谢大家!
final
关键字与使用的内存量无关,它只表示变量的值不可更改。然而,由于变量被声明为 static
,因此只有一个属于类而不是特定实例的变量。这段内容摘自这里:
如果一个字段被声明为
static
,那么无论最终创建多少个该类的实例(可能为零),该字段都只存在一个实例。有时称为类变量的静态字段在类初始化时创建。未声明为静态的字段(有时称为非静态字段)称为实例变量。每当创建类的新实例时,都会为该类或其任何超类中声明的每个实例变量创建一个与该实例关联的新变量。
static final
修饰的常量变量,并且只使用这些变量而不创建该类的实例。当应用程序启动时,即使我没有使用这些常量变量,它们是否仍将保留在内存中(或者在栈中,因为这些变量是原始类型)? - Jemshit Iskenderov因为被声明为static
,所以只会使用1个*MyVar内存。
这是静态的,因此是类作用域 -> 1。
编辑:实际上,这取决于类加载器。通常情况下,您只有一个类的副本,但如果您有多个类加载器/类存储库(可能在应用程序服务器等中),则可能会出现更多。
class Foo {
public static final String S = "Hello, world!";
}
class Bar {
public static void main(String[] args) {
// No real access to class Foo here
// String "Hello, world!" is inlined into the constant pool of class Bar
String s = Foo.S;
System.out.println(s);
}
}
Foo
中更改Foo.S
的值,但不重新编译类Bar
,那么类Bar
将打印Foo.S
的旧值。静态意味着每个类只有一个实例,静态变量只创建一次并且可以在不同的对象之间共享。
最终变量一旦初始化就不能改变其值。最终静态变量用于创建常量(不可变)并直接引用,无需使用对象。
static 意味着你只会有一个实例。
final 只是意味着你不能重新分配那个值。
final
对内存需求没有影响。而 static
则有影响。 - Joachim Sauerstatic
,因为静态变量在类的所有实例之间是共享的,因此只需要与变量的一个实例一样多的空间。将变量声明为final
使其在声明或构造函数之外不可变。final
使得内存使用量为 1*instances
。
然而,static
则仅为 1
。
1
的大小取决于实际使用的 JVM,可能是 4 字节或 8 字节。(在 64 位 JVM 上,由于字对齐问题,您可能会浪费 4 字节。) - Stephen C