【发布时间】:2019-02-18 19:51:09
【问题描述】:
我已经在 Stack Overflow 和网络上的其他地方看到了一些关于静态变量的内容。但是,我并不清楚答案。当我认为我找到了答案时,其他一些来源与该陈述相矛盾(或者至少,我认为确实如此)。
例如:m0bius 在How does the static keyword work in Java? 中告诉我们(在“何时创建此副本[编辑静态变量]?”部分)静态变量是在运行时创建的。但是如果我检查https://en.wikipedia.org/wiki/Class_variable(“静态成员变量和静态成员函数”部分),它会告诉我在某些语言中会发生相反的情况,而在其他语言中也会发生同样的情况。
我的问题可以分为两个不同的问题:
- 在 Java 中,类的静态变量是在运行时还是在编译时创建的?
- 在 Java 中,类的 final static 变量是在运行时还是在编译时创建的?
我的意思是编译时间与运行时间:
- 编译时间:编译源代码时(即创建.class文件时)
- 运行时间:程序实际运行的时间
部分代码仅用于本题:
// MyClass.java
public class MyClass {
public static int instances;
public final static double PI = 3.14159265359
public MyClass() {
instances++;
}
// ...
}
// Main.java ; version 1
public class Main {
public static void main(String args[]) {
System.out.println("I am doing nothing with MyClass");
}
}
// OUTPUT: I am doing nothing with MyClass
// Main.java ; version 2
public class Main {
public static void main(String args[]) {
System.out.println("PI = " + MyClass.PI);
MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();
System.out.println("instances = " + MyClass.instances);
}
}
OUTPUT:
3.14159265359
2
如果 static 和 final static 变量都将在运行时创建,那么在 Main 的第一个版本中,MyClass 类的两个静态变量(实例和 PI)都不会被创建。但我有点希望 final static 变量 PI 将在编译时创建(因此它将“嵌入”在 .class 文件中),因为我认为这会有更好的性能(无论 MyClass 类发生什么情况,PI 将始终为 3.14159265359,因此最好将其放入二进制文件中。
这可能与静态变量相同,但它可能会在整个程序中发生变化。
【问题讨论】:
-
Java 中的一切都是在运行时创建的,因为 Java 是一种解释型语言。您真正要问的是如何在堆栈和堆上分配内存。
-
这些都不能编译,因为 PI 没有类型。我想你的意思是双重的。静态变量与类相关联,而不是与实例相关联。最终引用不能更改,但如果它是可变的,则可以更改它们的状态。您对性能的担忧无关紧要。
-
@Dylan,谢谢。
-
@duffymo,问题解决了:我确实忘记写双精度了!