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

它的工作。 在声明之前放置该关键字意味着什么? 它究竟会做什么和/或限制哪些对象可以做什么?


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

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

由于static方法也不属于特定实例,因此它们不能引用实例成员(您如何知道要引用哪个实例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或线程的一个,但这不是重点。


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

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

除非你需要在主要以外的某个地方使用“时钟”,否则这种方法同样适用:

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

static关键字意味着某些东西(一个字段,方法或嵌套类)与类型相关,而不是类型的任何特定实例。 因此,例如,没有Math类的任何实例就调用Math.sin(...) ,并且实际上不能创建Math类的实例。

有关更多信息,请参阅Oracle Java教程的相关部分。


边注

不幸的是,Java允许你像静态成员一样访问静态成员,例如

// Bad code!
Thread.currentThread().sleep(5000);
someOtherThread.sleep(5000);

这使得它看起来好像sleep是一种实例方法,但它实际上是一种静态方法 - 它总是使当前线程休眠。 在调用代码中清楚说明这是更好的做法:

// Clearer
Thread.sleep(5000);
链接地址: http://www.djcxy.com/p/78809.html

上一篇: What does the 'static' keyword do in a class?

下一篇: Static initializer in Java