具体来说,我正在尝试以下代码:
package hello; public class Hello { Clock clock = new Clock(); public static void main(String args[]) { clock.sayTime(); } }
但它给出了错误
无法访问静态方法 main 中的非静态字段
所以我将声明更改为clock:
clock
static Clock clock = new Clock();
它奏效了。将关键字放在声明之前是什么意思?就可以对该对象执行的操作而言,它究竟会做什么和/或限制什么?
static成员属于类而不是特定实例。
static
这意味着 只有一个static字段实例存在[1],即使您创建了该类的一百万个实例或者您没有创建任何实例。它将由所有实例共享。
由于static方法也不属于特定实例,因此它们不能引用实例成员。在给出的示例中,main不知道应该引用Hello哪个类的实例(因此也不知道该类的哪个实例Clock)。static会员只能指static会员。实例成员当然可以访问static成员。
main
Hello
Clock
旁注: 当然,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 或线程一个,但这不是重点。