具体来说,我正在尝试此代码:

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]:根据运行时特征,每个类负载程序或AppDomain或线程可能是一个,但这在点旁边。

来自: stackoverflow.com