静的
キーワードstaticを使用して、メソッド、変数、およびコードブロックを変更できます。staticで定義された変数またはメソッドは、クラス名で直接参照できます。
静的コードブロック
静的コードブロックも静的ブロックです。クラス内のどこにでも配置でき(メソッド内を除く)、クラスは複数の静的ブロックを持つことができます。JVMがクラスをロードするとき、静的データはクラスがロードされるとき(.classファイルを生成するとき)に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関数では、クラスが初期化されるときの実行順序は、静的ドメイン(静的属性と静的ブロックを含む)>非静的ドメイン>属性>コンストラクターであることがわかります。静的ブロックであることがわかります。は、その時点でExecutedクラスにロードされ、生成された.classファイルをロードした後、インスタンスオブジェクトを再度定義すると、静的ブロックは実行されません。静的プロパティと静的ブロックの順序は、クラス内の定義の順序に従って決定されます。
静的ブロックは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クラスがロードされた後、引き続きTestクラスをロードし、Testクラスに静的ブロックがあることを確認して、静的ブロックを実行します。必要なクラスをロードした後、mainメソッドが実行されます。mainメソッドでnewTest()を実行すると、最初に親クラスのコンストラクターが呼び出され、次に独自のコンストラクターが呼び出されます。したがって、上記の出力結果が表示されます。
静的変数
静的変数は静的変数と呼ばれます。静的変数はクラスがロードされるときに初期化されます。メモリには1つしかなく、JVMはメモリを1回だけ割り当てます。同時に、クラスのすべてのインスタンスが静的変数を共有します。クラス名から直接アクセスできます。ただし、Javaの文法では、== staticを使用してローカル変数==を変更することは許可されていないことに注意してください。
ただし、インスタンス変数は異なります。インスタンスが付随します。インスタンスが作成されるたびに、インスタンス変数が生成され、インスタンスとともに存続し、消滅します。
したがって、通常、オブジェクト間でのデータの共有と簡単なアクセスという2つの状況で静的変数を使用します。
静的メソッド
静的メソッドは静的メソッドと呼ばれ、クラス名で直接呼び出すことができます。静的メソッドはオブジェクトに依存せずにアクセスできるため、静的メソッドはオブジェクトに依存しないため、これはありません。この機能により、非静的メンバーメソッド/変数は呼び出される特定のオブジェクトに依存する必要があるため、クラスの非静的メンバー変数および非静的メンバーメソッドに静的メソッドでアクセスすることはできません。
「Javaプログラミングの考え方」では、静的メソッドは次のように説明されています。「静的メソッドはこれがないメソッドです。静的メソッド内で非静的メソッドを呼び出すことはできません。その逆も同様です。オブジェクトを作成します。クラス自体が静的メソッドを呼び出します。これが実際には静的メソッドの主な目的です。」
上記に誤りがある場合は、訂正してください。
参考資料:
https ://www.cnblogs.com/dolphin0520/p/3799052.html
https://blog.csdn.net/zhangerqing/article/details/8294039
https://www.cnblogs.com/chenssy/p /3413229.html