由甲骨文提供定义 http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html,
有时,您希望拥有所有对象共有的变量。这是通过 static 修饰符来完成的。声明中带有 static 修饰符的字段称为静态字段或类变量。它们与类相关联,而不是与任何对象相关联。类的每个实例共享一个类变量,该变量位于内存中的一个固定位置。
根据这个定义,可以安全地推断出静态变量属于该类,并且该类的任何对象都不应访问该变量进行修改。因为所有对象都共享它。
因此,来自同一定义的这一行有点令人困惑:
任何对象都可以更改类变量的值...
所以我尝试了这段代码,它打印了 45 (尽管我收到一条警告“通过实例引用访问静态成员”):
public class Main {
static int value = 8;
public static void main(String[] args) {
// write your code here
Main main = new Main();
main.value = 45;
System.out.println(value);
}
}
如果这是一个Student
类,我有一个名为的静态变量numberOfStudents
,为什么应该允许该类的一个对象更改该类变量的值?
它不是really“一个对象”可以 - 只是您所在的代码可以访问该变量,不幸的是,Java 允许您访问静态成员(变量和方法),就好像它们是实例成员一样。这最终会产生非常误导性的代码,例如
Thread t = new Thread(...);
t.start();
t.sleep(1000);
最后一行looks就像它要求新启动的线程休眠一样 - 但是actually它会让当前线程休眠。
这基本上是Java 中的一个缺陷。编译器会默默地将这样的代码变成
Thread.sleep(1000);
或者在你的情况下
Main.value = 45;
(我相信在旧版本的 Java 中,它会发出代码来检查您“通过”访问静态成员的变量是否为空,但它甚至不再这样做了。)
许多 IDE 允许您使用警告或错误来标记此类代码。我鼓励您打开这样的功能。如果您看到这样的现有代码,请将其更改为通过声明类直接访问静态成员,这样就清楚发生了什么。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)