ロード順
まず結論を果たします。
コードの静的プロパティ(メンバ変数)>親クラス静的ブロック親>サブクラス静的プロパティ>コードのサブクラス静的ブロック>親非静的プロパティ>コードの親クラスの非静的ブロック>親クラスのコンストラクタ>サブクラス非静的プロパティ>サブクラスは、非静的>サブクラスのコンストラクタをブロック
だから、どのくらいあなたはそれを覚えていますか?!
ここでは概要次の特性を助けるために:
- 静的プロパティとコードブロック、IFおよび新しいクラスが初めてプログラムであるか、またはコールをロードする最初のクラスは、(永久回復の世代にかかわらず)でトリガする場合にのみ。正確にこれらの理由から、クラスは/新しいロードされているオブジェクトよりも優先され、それは非静的に優先して静的です。
- 属性(メンバ変数)工法よりも優先、理解することができる、このクラス全体がロードされている、あなたは、クラスのプロパティを持っているかを知る必要があり、初期化が完了し、これらのプロパティの後に、このクラスのオブジェクトが完了したと見なされます。加えて、1つの非静的コードブロックは、新しいオブジェクトの準備は、実際には、コンストラクタは、任意の外部パラメータを受け付けないこと。そのため、属性>非静的ブロック>コンストラクタ。
- 興味深いことに、(最初の4つ)の静的部分(6後)親クラス>のサブクラスではなく、静的部分は、親クラス>サブクラスです。
- また、それぞれの新しいオブジェクトのコードの非静的ブロックが実行されることを見落とすこと、それは簡単に理解することができる:非静的コードブロックは、公式のコンストラクタの前に(コード>コンストラクタの非静的ブロック)を動作するように準備ができています。
1 / ** 2 * @author Lean.Li 3 * @date 2018年10月15日 4 * / 5 パブリック クラスメイン{ 6 7 静的 クラスA { 8 静的こんにちはHI = 新しいハイ( "A" )。 9 10 こんにちはHI2 = 新こんにちは( "A2" ); 11 12 静的{ 13 のSystem.out.println( "静的" )。 14 } 15 16 { 17 System.out.println( "AAA" )。 18 } 19 20 パブリックA(){ 21 のSystem.out.println( "INIT" )。 22 } 23 } 24 25 26 静的 クラス Bは延び{ 27 静的こんにちはHI = 新しいハイ( "B"を)。 28 29 こんにちはHI2 = 新こんにちは( "B2" ); 30 31 静的{ 32 のSystem.out.println( "静的B" )。 33 } 34 35 { 36 のSystem.out.println( "BBB" )。 37 } 38 39 公衆B(){ 40 のSystem.out.println( "Bの初期化" )。 41 } 42 } 43の 44 静的 クラスこんにちは{ 45 公共のHi(文字列str){ 46 のSystem.out.println( "こんにちは" + STR)。 47 } 48 } 49 50 公共 静的 ボイドメイン(文字列[]引数){ 51である のSystem.out.println( "最初の新しい新B:" ); 52である B = B 新しい新; B() 53である のSystem.out.println(); 54である のSystem.out.println( "B 2番目の新しい新しいです:" )。 55 B = 新しい新B(); 56である } 57は、 58 }
結果は以下の通りであります:
初次新しいB: こんにちは静的 こんにちはB B 静的 こんにちはA2 AAA Aのinit こんにちはB2 BBB Bのinit 第二次の新しいB: こんにちはA2 AAA Aのinit こんにちはB2 BBB Bのinit