在一个类中,“static”关键字有什么作用?
在一个类中,“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日
这意味着,在 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(); } }
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 或线程一个,但这并不重要。