Java学習のキーワードstatic

6176 ワード

static
キーワードstaticは、メソッド、変数、コードブロックを修飾するために使用することができ、staticによって定義された変数またはメソッドは、クラス名で直接参照することができる.
staticコードブロック
staticコードブロック、すなわち静的ブロック.メソッドの内部を除いて、クラスの任意の場所に配置できます.クラスには複数のstaticブロックがあります.JVMでクラスをマウントする場合、スタティックデータはクラスマウント(.classファイルの生成)時に1回のみ実行され、スタティックコードブロックも同様であり、クラス内のすべてのスタティックブロックはクラスのロードに伴って実行され、クラスがロードされると実行され、また1回の初期化のみが行われ、主にクラスの初期化に用いられる.
参考になる例があります
public class Person {

    public Person(int id) {
        System.out.println("person(" + id + ")");
    }
    public static void main(String[] args) {
        Build b = new Build();
        System.out.println("------   ------");
        Build b2=new Build();
    }
}

class Build {

    /*   */
    static{
        System.out.println("this is static block!");
    }
    /*    */
    {
        System.out.println("this is non-static block!");
    }
    Person p1 = new Person(1);//------------1-----------

    public Build() {
        System.out.println("this is build's block!");
        Person p2 = new Person(2);
    }

    Person p3 = new Person(3);

}

出力結果:
This is static block!
This is non-static block!
person(1)
This is build's block!
person(2)
------   ------
This is non-static block!
person(1)
This is build's block!
person(2)

ここでmain関数でクラスを初期化するときの実行順序は、静的ドメイン(静的プロパティと静的ブロックを含む)>非静的ドメイン>プロパティ>コンストラクタであることから、静的ブロックはクラスロード時に実行され、.classファイルが生成されたマウント後、インスタンスオブジェクトが再定義され、静的ブロックは実行されないことがわかります.静的プロパティと静的ブロックの優先順位は、クラスで定義された優先順位に基づいて決定されます.
静的ブロックは1回しか実行されないため、1回の初期化操作が必要な場合にstaticコードブロックに入れて行うことで、効率を効果的に向上させ、1つのオブジェクトをインスタンス化するたびに1回実行することを回避することができる.
実行順序の例についてもう一つ
public class Test extends Base{

    static{
        System.out.println("test static");
    }

    public Test(){
        System.out.println("test constructor");
    }

    public static void main(String[] args) {
        new Test();
    }
}

class Base{

    static{
        System.out.println("base static");
    }

    public Base(){
        System.out.println("base constructor");
    }
}

出力された結果は次のとおりです.
base static
test static
base constructor
test constructor

すなわち、実行開始には、まずmainメソッドを見つける必要があるが、mainメソッドを実行する前に、先にTestをロードする必要があり、Testをロードする過程でTestクラスがBaseクラスから継承されていることが判明したため、先に回ってBaseクラスをロードする必要があり、Baseクラスをロードする際にstaticブロックが発見され、staticブロックが実行される.Baseクラスのロードが完了すると、Testクラスをロードし続け、Testクラスにもstaticブロックがあることを発見してstaticブロックを実行します.必要なクラスをロードした後、mainメソッドの実行を開始します.mainメソッドでnewTest()を実行するときは、親のコンストラクタを呼び出してから、自身のコンストラクタを呼び出します.そのため、上記の出力結果が表示されます.
static変数
static変数は静的変数と呼ばれ、静的変数はクラスのロード時に初期化が完了し、メモリに1つしかなく、JVMにも1回のメモリしか割り当てられず、クラスのすべてのインスタンスが静的変数を共有し、クラス名で直接アクセスできます.ただし、java構文では、==staticはローカル変数を修飾するために使用できない==であることに注意してください.
しかし、インスタンス変数は異なり、インスタンスが作成されるたびにインスタンス変数が生成され、インスタンスと共生共死します.
したがって、オブジェクト間でデータを共有し、アクセスが便利な静的変数を使用するのが一般的です.
staticメソッド
staticメソッドは静的メソッドと呼ばれ,クラス名で直接呼び出すことができる.静的メソッドは、任意のオブジェクトに依存せずにアクセスできるため、静的メソッドでは、任意のオブジェクトに依存しないため、thisはありません.この特性のため、クラスの非静的メンバー変数および非静的メンバーメソッドは、非静的メンバーメソッド/変数が呼び出されるには特定のオブジェクトに依存しなければならないため、静的メソッドではアクセスできません.
「javaプログラミング思想」では、staticメソッドについてこう説明しています.「staticメソッドはthisがないメソッドです.staticメソッドの内部では非静的メソッドを呼び出すことはできませんが、逆にできます.また、オブジェクトを作成することなく、クラス自体だけでstaticメソッドを呼び出すことができます.これは実際にstaticメソッドの主な用途です.」
上記に間違いがあれば、指摘を歓迎します.参考資料:https://www.cnblogs.com/dolphin0520/p/3799052.html https://blog.csdn.net/zhangerqing/article/details/8294039 https://www.cnblogs.com/chenssy/p/3413229.html