我已经在 Stack Overflow 和网络上的其他地方看到了一些关于静态变量的内容。但是,我并不清楚答案。当我认为我找到了答案时,其他一些来源与该陈述相矛盾(或者至少,我认为确实如此)。
例如:m0bius 告诉我们static 关键字在 Java 中是如何工作的?(在“何时创建此副本[编辑静态变量]?”部分中)静态变量是在运行时创建的。但是,如果我检查https://en.wikipedia.org/wiki/Class_variable(“静态成员变量和静态成员函数”部分),它会告诉我在某些语言中会发生相反的情况,而在其他语言中也会发生同样的情况。
我的问题可以分为两个不同的问题:
在Java中,类的静态变量是在运行时还是在编译时创建的?
在Java中,类的最终静态变量是在运行时还是在编译时创建的?
我的意思是编译时间与运行时间:
编译时间:编译源代码的时间(即创建 .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
如果静态变量和最终静态变量都在运行时创建,那么在 Main 的第一个版本中,MyClass 类的两个静态变量(实例和 PI)都不会创建。但我有点期望最终的静态变量 PI 将在编译时创建(因此它将被“嵌入”在 .class 文件中),因为我认为这会有更好的性能(无论类发生什么情况MyClass,PI 将始终为 3.14159265359,因此最好将其放入二进制文件中)。
这可能与静态变量相同,但它可能会在整个程序中发生变化。
莫回无
相关分类