1. ホーム

[解決済み】クラスで「static」キーワードは何をするのですか?

2022-03-24 19:15:24

質問

具体的には、このようなコードを試していました。

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 メンバは特定のインスタンスではなく、クラスに属しています。

という意味です。 のインスタンスは1つだけです。 static フィールドが存在する [1] そのクラスのインスタンスを100万個作っても、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やスレッドごとに1つになることもありますが、それはさておき。