問題:Javaのオブジェクトの初期化の主な方法がありますか?彼らは何ですか?
上記の問題については、確かに私たちの心に来る最初は、コンストラクタ、はい、コンストラクタが一般的に使用されているJavaオブジェクトの初期化メソッドへの答えがあります。
そこビルダー効果もあるとJavaオブジェクトを操作するために初期化することができ、初期化ブロック、非常によく似ています。以下は、メインブロックとJavaの初期化の実行について説明します。
次のようにブロックが実際にJavaクラスのメンバーであるJavaの初期化は、その構文は次のとおりです。
[修飾] {
実行可能コードの//初期化ブロック
...
}
モディファイの初期化ブロックが唯一の静的することができ、static修飾子は、静的な初期化ブロックの初期化ブロックと呼ばれ、それは背面に導入されます。
あなたは犬のいくつかのコードを見てみましょうオブジェクトを作成するときに何が起きます。
パブリック クラス犬{ // 初期化ブロックの定義 { するSystem.out.println(「第1の初期化ブロック」); } // 第2の初期化ブロックを定義する { するSystem.out.println(「第2の初期化ブロック」) ; } // 非引数コンストラクタの定義 パブリック犬(){ System.out.printlnは(「犬の引数なしコンストラクタ」); } 公共の 静的な 無効メイン(文字列[]引数){ 新しい新しい犬(); } }
業績は次のとおりです。
最初のブロック初期化する
第2初期化ブロック
犬引数なしコンストラクタを
結果から分かるように:犬オブジェクト、初期化ブロックコンストラクタに、プログラムの実行、及び2つの初期化の実行順序を作成する場合がフロントとリアの順序に従って実行されます。
初期化ブロックの実行隠者ので、プログラムは、より簡潔で読みやすくするために、唯一のクラス初期化ブロックの通常最大Javaオブジェクト(すべての初期化ブロックのすべての実行)を作成する場合にのみ。
オブジェクトが実行されるときに初期化ブロックとコンストラクタが作成されているので、彼らはそれがどのような違いを生むんか?
ある程度、初期化ブロック補体コンストラクタ、およびコンストラクタに任意のパラメータを受信することができず、コンストラクタパラメータを受信することができ、コードの固定された初期化ブロックが実行され、異なっています。プログラムは2つのコンストラクタを持っており、彼らは、コードパラメータを受信せずに共通している場合、これらはブロック、より保守コードを初期化するために、同じ共通のコードに入れることができます。
通常の初期化ブロックが静的変更された場合、その後、初期化ブロックは、クラス初期化ブロックと呼ばれる静的初期化ブロック。
静的初期化ブロックが初期化されているクラスを担当しながら、オブジェクトを初期化する初期化ブロックを担当する一般的には、静的な初期化ブロックは、常に通常の初期化ブロックよりも、最初に実行されます。
静的ブロックは、典型的にはクラス変数を初期化する初期化処理を実行するために使用され、インスタンス変数は、初期化処理を行うことができません。
静的初期化ブロックは、静的クラスメンバーである、静的メンバは、まだインスタンス変数とインスタンスメソッドにアクセスできないことを含め、非静的メンバにアクセスすることはできませんルールに従う必要があります。
初期化ブロックの実行がバックjava.lang.Objectクラスにトレースされていた場合は、初期化ブロックのオブジェクトを実行し、最終的には自分のクラスの初期化ブロックを実行する...親クラスの初期化ブロックを実行します。
この実行順序を見て、次のコードの結果:
クラス生物{ 静的{ するSystem.out.println( "静的初期化ブロック生物" ); } { のSystem.out.println( "通常の初期化ブロック生物" ); } パブリック生物(){ System.out.printlnは( "生物学、引数なしコンストラクタ「); } } クラス動物ザが延びる生物学{ 静的{ するSystem.out.println(」動物の静的初期化ブロックを「); } { のSystem.out.println(」動物の通常の初期化ブロック」)。 } パブリック動物(){ System.out.println(「動物引数なしコンストラクタ」); } 公共動物(文字列名){ この(); //は同一で、コンストラクタのオーバーロードを呼び出す 動物とのSystem.out.println(「基準設定デバイス名=「+ 名); } } クラスキャット延び動物{ 静的{ するSystem.out.println(」猫の静的初期化ブロック「); } { のSystem.out.println(」猫の通常の初期化ブロック」)。 } パブリックキャット(){ // で親クラスのコンストラクタ引数を呼び出して スーパー(「Javaの書籍」); System.out.println(「猫の引数なしコンストラクタ」); } } パブリック クラスのテスト{ 公共 静的 ボイドメイン(文字列[]引数){ 新しい新しい猫(); のSystem.out.println(「=========」) ; 新しい新しい猫(); } }
次のように実行結果は以下のとおりです。
静的初期化ブロック生物学 動物静的初期化ブロック の静的初期化ブロックキャッツ の通常の初期化ブロック生物 の引数なしのコンストラクタ生物学 動物共通の初期化ブロック 動物、引数なしのコンストラクタ 動物パラメータコンストラクタの、名前は = Javaの書籍 猫のを一般的な初期化ブロックの 猫、引数なしのコンストラクタを ========= 通常の初期化ブロックの生物 学、引数なしのコンストラクタ 動物の正常な初期化ブロック 動物の引数なしのコンストラクタ 動物がパラメータコンストラクタ、名前 = ジャワクラシック 猫の一般的な初期化ブロック 猫引数なしのコンストラクタ
上記観点の結果から、あなたが最初の猫のオブジェクトを作成するときに、システムがまだ猫のオブジェクトを持っているので、あなたはCatクラスをロードして初期化する必要があるので、Catクラスが最初にその最上位の親をブロックする静的初期化を実行し、実行されます初期化静的初期化は、その直接の親クラスをブロックし、そして最終的には静的初期化ブロック自体を行います。
Catクラスの初期化が成功したら、第二、その後、もはや猫Catクラスのオブジェクトを作成するには、初期化する必要がある場合、それは常に仮想マシンに存在しています。
要約すると、クラスの実行順序が初期化される静的初期化ブロックの親クラス、クラスの静的初期化ブロック、初期化ブロック共通の親、親クラスのコンストラクタ、クラス初期化ブロックの一般的な、クラスのコンストラクタ。
ようこそ懸念公共マイクロチャネル番号] [Javaの書籍、Javaテクノロジは、より多くのドライ見て!Javaの懸念Jisongデータのフルセット
▼次のマイクロチャネルの二次元コードフォロー図スイープ↓↓↓