“static”关键字在类中有什么作用?

新手上路,请多包涵

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

 package hello;

public class Hello {

    Clock clock = new Clock();

    public static void main(String args[]) {
        clock.sayTime();
    }
}

但它给出了错误

无法访问静态方法 main 中的非静态字段

所以我将 clock 的声明更改为:

 static Clock clock = new Clock();

它奏效了。将那个关键字放在声明之前是什么意思?就可以对该对象执行的操作而言,它究竟会做什么和/或限制什么?

原文由 Ali 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 418
2 个回答

static 成员属于类而不是特定实例。

这意味着 只有一个 static 字段的实例存在[1]即使您创建了该类的一百万个实例或者您没有创建任何实例。它将被所有实例共享。

由于 static 方法也不属于特定实例,因此它们不能引用实例成员。在给出的例子中, main 不知道它应该引用 Clock 类的哪个实例(因此也不知道 Hello 类的哪个实例)。 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 或线程一个,但这不是重点。

原文由 mmx 发布,翻译遵循 CC BY-SA 4.0 许可协议

这意味着在 Hello 中只有一个“时钟”实例,而不是“Hello”类的每个单独实例一个,或者更多,这意味着在所有实例之间将有一个共同共享的“时钟”引用“你好”类。

因此,如果您要在代码中的任何位置执行“new Hello”: A- 在第一种情况下(更改之前,不使用“static”),每次调用“new Hello”时都会创建一个新时钟,但 B- 在第二种情况下(更改后,使用“静态”),每个“新 Hello”实例仍将共享并使用最初创建的初始和相同“时钟”引用。

除非你在 main 之外的某个地方需要“时钟”,否则这也同样有效:

 package hello;
public class Hello
{
    public static void main(String args[])
    {
      Clock clock=new Clock();
      clock.sayTime();
    }
}

原文由 Paul Tomblin 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题