猿问

'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();

它奏效了。在声明之前放置该关键字是什么意思?对于该对象可以做什么,它究竟会做什么和/或限制什么?


qq_笑_17
浏览 445回答 4
4回答

胡子哥哥

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

杨__羊羊

这意味着Hello中只有一个“clock”实例,而不是“Hello”类的每个单独实例中的一个实例,或者更多 - 这意味着在所有实例中都会有一个共同的“时钟”引用。 “Hello”课程。所以,如果你要在你的代码中的任何地方做一个“新的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();         }}

Helenr

该static关键字是指某物(字段,方法或嵌套类)是相关于类型,而不是任何特定的实例的类型。因此,例如,一个调用Math.sin(...)没有Math该类的任何实例,实际上您无法创建Math该类的实例。有关更多信息,请参阅Oracle Java教程的相关部分。边注遗憾的是, Java 允许您像访问实例成员一样访问静态成员,例如// Bad code!Thread.currentThread().sleep(5000);someOtherThread.sleep(5000);这使它看起来好像sleep是一个实例方法,但它实际上是一个静态方法 - 它总是使当前线程休眠。最好在调用代码中明确这一点:// ClearerThread.sleep(5000);

慕村225694

staticJava中的关键字表示变量或函数在该类的所有实例之间共享,因为它属于类型,而不是实际的对象本身。因此,如果您有一个变量:private static int i = 0;并i++在一个实例中递增it(),则更改将反映在所有实例中。i在所有情况下现在都是1。可以在不实例化对象的情况下使用静态方法。
随时随地看视频慕课网APP

相关分类

Java
我要回答