Javaでのstaticキーワード

Javaのstaticキーワードは、Javaプログラミングでよく使用されます。Javaのstaticキーワードは、Javaでクラスレベルの変数を作成するために使用されます。static変数とメソッドは、クラスのインスタンスではなく、クラスの一部です。

Javaのstaticキーワード

Javaのstaticキーワードは、以下の画像に示すように5つのケースで使用できます。ここではそのうちの4つを議論します。5番目のものはJava 8で導入され、Java 8インターフェースの変更で議論されました。

  1. Java static variable

    クラスレベルの変数にstaticキーワードを使用できます。静的変数はクラス変数であり、クラスのオブジェクト/インスタンスに属しません。静的変数はオブジェクトのすべてのインスタンスで共有されるため、スレッドセーフではありません。通常、静的変数は、すべてのオブジェクトで使用できる共通のリソースや定数にfinalキーワードとともに使用されます。静的変数がprivateでない場合、ClassName.variableNameでアクセスできます。

        //静的変数の例
        private static int count;
        public static String str;
        public static final String DB_USER = "myuser";
    
  2. Javaの静的メソッド

    静的変数と同様に、静的メソッドもクラスに属し、クラスのインスタンスに属しません。静的メソッドは、クラスの静的変数にのみアクセスし、クラスの静的メソッドのみを呼び出すことができます。通常、静的メソッドは、インスタンスを作成する必要がない他のクラスから使用されるために公開したいユーティリティメソッドです。例えば、CollectionsクラスJavaラッパークラス、およびユーティリティクラスには多くの静的メソッドが含まれています。Javaプログラムのエントリーポイントであるmain()メソッド自体も静的メソッドです。

        //静的メソッドの例
        public static void setCount(int count) {
            if(count > 0)
            StaticExample.count = count;
        }
        
        //静的ユーティリティメソッド
        public static int addInts(int i, int...js){
            int sum=i;
            for(int x : js) sum+=x;
            return sum;
        }
    

    Java 8以降、インターフェースでも静的メソッドを持つことができます。詳細については、Java 8のインターフェースの変更点をご覧ください。

  3. Javaの静的ブロック

    Javaの静的ブロックは、Java ClassLoaderによってメモリにロードされる際に実行されるステートメントのグループです。静的ブロックはクラスの静的変数を初期化するために使用されます。ほとんどの場合、クラスがロードされるときに静的リソースを作成するために使用されます。静的ブロックでは非静的変数にアクセスできません。クラスには複数の静的ブロックがある場合がありますが、それはあまり意味がありません。静的ブロックのコードはクラスがメモリにロードされるときに1回だけ実行されます。

        static{
            //クラスがロードされたときにリソースを初期化するために使用できます
            System.out.println("StaticExample static block");
            //静的変数とメソッドにのみアクセスできます
            str="Test";
            setCount(2);
        }
    
  4. Java Static Class

    ネストされたクラスにはstaticキーワードを使用できます。staticキーワードはトップレベルクラスでは使用できません。静的ネストクラスは他のトップレベルクラスと同じであり、単なるパッケージングの便宜上にネストしています。参照:Java Nested Classes

Javaのstaticキーワードの使用例をサンプルプログラムで見てみましょう。StaticExample.java

package com.journaldev.misc;

public class StaticExample {

    //staticブロック
    static{
        //クラスがメモリにロードされるときにリソースを初期化するために使用できます
        System.out.println("StaticExample static block");
        //static変数とメソッドのみにアクセスできます
        str="Test";
        setCount(2);
    }
    
    //同じクラス内の複数のstaticブロック
    static{
        System.out.println("StaticExample static block2");
    }
    
    //static変数の例
    private static int count; //kept private to control its value through setter
    public static String str;
    
    public int getCount() {
        return count;
    }

    //staticメソッドの例
    public static void setCount(int count) {
        if(count > 0)
        StaticExample.count = count;
    }
    
    //staticユーティリティメソッド
    public static int addInts(int i, int...js){
        int sum=i;
        for(int x : js) sum+=x;
        return sum;
    }

    //staticクラスの例 - 単なるパッケージングの便宜のために使用されます
    public static class MyStaticClass{
        public int count;
        
    }

}

静的変数、メソッド、静的クラスの使用方法をテストプログラムで見てみましょう。TestStatic.java

package com.journaldev.misc;

public class TestStatic {

    public static void main(String[] args) {
        StaticExample.setCount(5);
        
        //非private static変数はクラス名でアクセスできます
        StaticExample.str = "abc";
        StaticExample se = new StaticExample();
        System.out.println(se.getCount());
        //クラスとインスタンスのstatic変数は同じです
        System.out.println(StaticExample.str +" is same as "+se.str);
        System.out.println(StaticExample.str == se.str);
        
        //staticネストされたクラスは通常のトップレベルクラスと同じです
        StaticExample.MyStaticClass myStaticClass = new StaticExample.MyStaticClass();
        myStaticClass.count=10;
        
        StaticExample.MyStaticClass myStaticClass1 = new StaticExample.MyStaticClass();
        myStaticClass1.count=20;
        
        System.out.println(myStaticClass.count);
        System.out.println(myStaticClass1.count);
    }
    
}

上記のJavaのstaticキーワードの使用例プログラムの出力は次のとおりです:

StaticExample static block
StaticExample static block2
5
abc is same as abc
true
10
20

staticブロックのコードが最初に実行され、クラスがメモリにロードされるときに1度だけ実行されることに注意してください。その他の出力は自己説明的です。

Javaのstaticインポート

通常、私たちはクラス参照を使用して静的メンバーにアクセスします。Java 1.5から、クラス参照を回避するためにJavaの静的インポートを使用できます。以下はJavaの静的インポートの簡単な例です。

package com.journaldev.test;

public class A {

	public static int MAX = 1000;
	
	public static void foo(){
		System.out.println("foo static method");
	}
}
package com.journaldev.test;

import static com.journaldev.test.A.MAX;
import static com.journaldev.test.A.foo;

public class B {

	public static void main(String args[]){
		System.out.println(MAX); //normally A.MAX
		foo(); // normally A.foo()
	}
}

import文に注意してください。静的インポートの場合、クラスの完全修飾された静的メンバーの前にimport staticを使用する必要があります。クラスのすべての静的メンバーをインポートする場合、import static com.journaldev.test.A.*;のように*を使用できます。これはクラスの静的変数を複数回使用する場合にのみ使用すべきであり、可読性が損なわれる可能性があります。更新: 最近、Javaのstaticキーワードを説明するビデオを作成しました。以下のリンクからご覧いただけます。https://www.youtube.com/watch?v=2e-l1vb\_fwM

Source:
https://www.digitalocean.com/community/tutorials/static-keyword-in-java