具体来说,我正在尝试以下代码:
package hello;
public class Hello {
Clock clock = new Clock();
public static void main(String args[]) {
clock.sayTime();
}
}
但是它给了错误
因此,我将
clock
的声明更改为:static Clock clock = new Clock();
而且有效。将关键字放在声明之前是什么意思?就可以对对象执行的操作而言,它将确切执行和/或限制什么?
最佳答案
static
成员属于该类,而不是特定的实例。
这意味着即使您创建了该类的一百万个实例,也没有创建任何实例,但static
字段仅存在一个实例[1]。它将被所有实例共享。
由于static
方法也不属于特定实例,因此它们不能引用实例成员。在给定的示例中,main
不知道应引用Hello
类的哪个实例(因此也不知道Clock
类的哪个实例)。 static
成员只能引用static
成员。实例成员当然可以访问static
成员。
旁注:当然,static
成员可以通过对象引用访问实例成员。
例:
public class Example {
private static boolean staticField;
private boolean instanceField;
public static void main(String[] args) {
// a static method can access static fields
staticField = true;
// a static method can access instance fields through an object reference
Example instance = new Example();
instance.instanceField = true;
}
[1]:根据运行时的特性,每个ClassLoader或AppDomain或线程可以是一个,但那一点也不重要。