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

43 浏览
0 Comments

在一个类中,“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();

这样就可以了。在声明前加上那个关键字是什么意思?它到底会做什么,或者限制什么可以对那个对象进行操作?

admin 更改状态以发布 2023年5月24日
0
0 Comments

这意味着,在 Hello 中只有一个 "clock" 实例,而不是每个独立的 Hello 类实例都有一个实例,或者更进一步,这意味着所有 Hello 类实例之间将共享一个常用的 "clock" 引用。

因此,如果您在代码的任何地方执行 "new Hello":
A- 在第一种情况下(在更改之前,不使用 "static"),每次调用 "new Hello" 都会创建一个新的 clock,但是
B- 在第二种情况下(在更改后,使用 "static"),每个 "new Hello" 实例仍将共享并使用最初创建的相同的 "clock" 引用。

除非您需要在 main 之外的某个地方使用 "clock",否则这也可以正常工作:

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

0
0 Comments

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 或线程一个,但这并不重要。

0