浅談static
詳細
個人的な見方について簡単にstaticについて話します.Javaエンジニアにとってstaticは面接で聞かれやすいです.本題に戻りますが、書面ではstaticは静的です.実は私はそれを「全局的」と理解しています.全体とは何ですか.グローバルのプロパティ、グローバルのメソッド、グローバルのコードブロック.グローバルプロパティ、グローバルメソッド、比較的理解しやすいのは、このクラスのすべてのオブジェクトが共有するプロパティとメソッドです.クラス全体で共有されているため、宣言によって直接呼び出すことができます.これを「単例モード」の属性と方法と理解します.単一例モードとは、このクラスが宣言したすべてのオブジェクトがこれらの属性とメソッドを共有することを意味します.1つのオブジェクトがこのプロパティを変更し、すべてのオブジェクトがこのプロパティを再調整するのは変更後の値です.次は主にstatic修飾のコードブロックについて話しますが、面接の大きなポイントはstaticコードブロックがいつロードされたかです.まずjava仮想マシンのクラスへのロード手順を理解する必要があります.まずJVMはクラスのバイトコードをclassloaderで対応するClassオブジェクトに変換します.ここでclassloaderは、クラスファイルを検索するために両親から依頼された方法です.まず、親クラスのclassloaderに検索を依頼します(親クラスにも親クラスがある場合は、別のclassloaderのクラスを継承しないまで親クラスの親クラスに検索を依頼します)、見つからない場合は自分で検索します.自分でも見つからなければ異常を投げ出す.以上は準備作業で、このクラスが抽出されて使用されると、石化というクラス(親がいればまず親を初期化する)を示し、初期化の過程でstatic修飾のコードを処理します.ここでお話しするstaticコードブロックです.クラスごとに1回初期化されます.(クラスを初期化するかどうかは、メソッドClass.forName()の2番目のパラメータを変更して制御できます).ネット上で探している古典的な例を見てみましょう.面接のテーマは以下の通りです.プログラムの実行が完了した後の結果を書いてください.
最後の結果を言わないで、まず分析してみましょう.一歩一歩結果を出す.1.まず、プログラムの実行後の結果を分析し、プログラムのエントリを見つけてから、分析に着手しなければなりません.つまりmain()メソッドです.2.main()メソッドはXクラスにあり、main()メソッドを実行するには、まずXクラスをメモリにロードする必要があります.3.Xクラスのロードが完了したら、何をしますか?焦らないで、まずstaticの役割を見てみましょう.知らないでしょう.staticはクラスが最初にロードされたときに実行され、その後は実行されません.4.staticの役割を知ると、Xクラスがロードされ、まずXクラスの静的属性と静的文ブロック(static)が実行され、優先順位を実行して誰が先に誰を実行するかを見る.この時点でのみ実行され、以降は実行されません.5.だから一つの出力結果がttttttなので、大丈夫でしょう.6.Xクラスのstatic文ブロックの実行が完了したら、main()メソッドを実行します.7.new Z();このメソッドが実行されます.8.new Z();ではZクラスがロードされます.ZクラスはXクラスを継承するからです.Xクラスをロードする必要があります.Xクラスがロードされているからです.だからこの時Xクラスをロードする必要はありません.ZクラスがロードするとZクラスのstatic文ブロック9が実行される.それではttが印刷されるでしょう.10.すべてを追加すると、オブジェクトがインスタンス化されます.11.Zをインスタンス化する前に、Xをインスタンス化しなければなりませんよね.子クラスのコンストラクションメソッドは、親クラスのコンストラクションメソッドを呼び出すからです.12.では、まずXクラスをインスタンス化しましょう.13.Xメソッドを実行する前に、ペアを初期化する必要があります.つまり、すべてのプロパティを取得します.するとXクラスの属性Yが取得される.14.すなわちXクラスのY y=new Y()である.実行されます.つまりYが印刷されます.15.次にSystemを実行する.out.println("X"); 16.次にZの構成方法17を実行する.同様にZの属性Y y=new Y()を先に取得する.Yを印刷します.18.システムを再実行する.out.println("Z");
個人的な見方について簡単にstaticについて話します.Javaエンジニアにとってstaticは面接で聞かれやすいです.本題に戻りますが、書面ではstaticは静的です.実は私はそれを「全局的」と理解しています.全体とは何ですか.グローバルのプロパティ、グローバルのメソッド、グローバルのコードブロック.グローバルプロパティ、グローバルメソッド、比較的理解しやすいのは、このクラスのすべてのオブジェクトが共有するプロパティとメソッドです.クラス全体で共有されているため、宣言によって直接呼び出すことができます.これを「単例モード」の属性と方法と理解します.単一例モードとは、このクラスが宣言したすべてのオブジェクトがこれらの属性とメソッドを共有することを意味します.1つのオブジェクトがこのプロパティを変更し、すべてのオブジェクトがこのプロパティを再調整するのは変更後の値です.次は主にstatic修飾のコードブロックについて話しますが、面接の大きなポイントはstaticコードブロックがいつロードされたかです.まずjava仮想マシンのクラスへのロード手順を理解する必要があります.まずJVMはクラスのバイトコードをclassloaderで対応するClassオブジェクトに変換します.ここでclassloaderは、クラスファイルを検索するために両親から依頼された方法です.まず、親クラスのclassloaderに検索を依頼します(親クラスにも親クラスがある場合は、別のclassloaderのクラスを継承しないまで親クラスの親クラスに検索を依頼します)、見つからない場合は自分で検索します.自分でも見つからなければ異常を投げ出す.以上は準備作業で、このクラスが抽出されて使用されると、石化というクラス(親がいればまず親を初期化する)を示し、初期化の過程でstatic修飾のコードを処理します.ここでお話しするstaticコードブロックです.クラスごとに1回初期化されます.(クラスを初期化するかどうかは、メソッドClass.forName()の2番目のパラメータを変更して制御できます).ネット上で探している古典的な例を見てみましょう.面接のテーマは以下の通りです.プログラムの実行が完了した後の結果を書いてください.
package extend;
public class X {
Y y=new Y();
static{
System.out.println("tttt");
}
X(){
System.out.println("X");
}
public static void main(String[] args) {
new Z();
}
}
class Y{
Y(){
System.out.println("Y");
}
}
class Z extends X{
Y y=new Y();
static{
System.out.println("tt");
}
Z(){
System.out.println("Z");
}
}
最後の結果を言わないで、まず分析してみましょう.一歩一歩結果を出す.1.まず、プログラムの実行後の結果を分析し、プログラムのエントリを見つけてから、分析に着手しなければなりません.つまりmain()メソッドです.2.main()メソッドはXクラスにあり、main()メソッドを実行するには、まずXクラスをメモリにロードする必要があります.3.Xクラスのロードが完了したら、何をしますか?焦らないで、まずstaticの役割を見てみましょう.知らないでしょう.staticはクラスが最初にロードされたときに実行され、その後は実行されません.4.staticの役割を知ると、Xクラスがロードされ、まずXクラスの静的属性と静的文ブロック(static)が実行され、優先順位を実行して誰が先に誰を実行するかを見る.この時点でのみ実行され、以降は実行されません.5.だから一つの出力結果がttttttなので、大丈夫でしょう.6.Xクラスのstatic文ブロックの実行が完了したら、main()メソッドを実行します.7.new Z();このメソッドが実行されます.8.new Z();ではZクラスがロードされます.ZクラスはXクラスを継承するからです.Xクラスをロードする必要があります.Xクラスがロードされているからです.だからこの時Xクラスをロードする必要はありません.ZクラスがロードするとZクラスのstatic文ブロック9が実行される.それではttが印刷されるでしょう.10.すべてを追加すると、オブジェクトがインスタンス化されます.11.Zをインスタンス化する前に、Xをインスタンス化しなければなりませんよね.子クラスのコンストラクションメソッドは、親クラスのコンストラクションメソッドを呼び出すからです.12.では、まずXクラスをインスタンス化しましょう.13.Xメソッドを実行する前に、ペアを初期化する必要があります.つまり、すべてのプロパティを取得します.するとXクラスの属性Yが取得される.14.すなわちXクラスのY y=new Y()である.実行されます.つまりYが印刷されます.15.次にSystemを実行する.out.println("X"); 16.次にZの構成方法17を実行する.同様にZの属性Y y=new Y()を先に取得する.Yを印刷します.18.システムを再実行する.out.println("Z");