###############################
今日は、初期化プロセスの新しいオブジェクトをまとめます。
###############################
まず、静的メンバの自由、マップケースを見て:
示されているように、我々は最初に、関連するクラスを定義し、ビル、家(ビルを継承)、ヴィラ(ハウスを継承)は、同時に、ハウスメンバーが可変のリビングルームを持って、リビングルームには、メンバーベッド変数とデスクがあります。
以下を達成するために特定のコード:
1 // 建筑 2 クラスビル{ 3 公共ビル(){ 4 のSystem.out.println( "ビル" )。 5 } 6 } 7 // 房子 8 クラスハウスは延びビル{ 9 公共リビングリビング= 新しいリビングルーム()。// 卧室 10 パブリック・ハウス(){ 11 のSystem.out.println( "家" )。 12 } 13 } 14 // 别墅 15 クラスヴィラ延びハウス{ 16 パブリックヴィラ(){ 17 のSystem.out.println( "ヴィラ" )。 18 } 19 } 20 // 卧室 21 クラスリビング{ 22 公衆ベッドbedFirst = 新しいベッド()。// 床 23 公共デスクdeskFirst = 新しいデスク(); // 桌子 24 25 公共リビングルーム(){ 26 のSystem.out.println( "リビング" )。 27 } 28 } 29 // 床 30 クラスベッド{ 31 公衆ベッド(){ 32 のSystem.out.println( "ベッド" )。 33 } 34 } 35 // 桌子 36 クラスデスク{ 37 公衆デスク(){ 38 のSystem.out.println( "机" )。 39 } 40 } 41 此时、我们新しいヴィラ(): 42 パブリック クラスInitializeDemo { 43 @Test 44 公共 ボイドtestInitialize(){ 45 ヴィラヴィラ= 新しい新しいヴィラ(); 46である } 47 } 48の 実行結果: 49 建物 50 ベッド 51が デスク 52は、 リビングルーム 53は ハウス 54れるヴィラ
この場合、我々はオブジェクトヴィラを作成するとき、私たちは、最初のオブジェクトの親クラスヴィラの家を作成しようとしますが、ハウスは、親クラスビル、ビルだけでなく、親オブジェクトを持っています。そのため、実際には、このクラスは、オブジェクトを作成し、オブジェクトを初期化します、オブジェクトが作成されたオブジェクトを初期化され、オブジェクトは、建物にはメンバ変数をオブジェクトないので、コンストラクタの直接の実装は、建物をプリントアウト、建物を作成することです。
家はオブジェクトを作成し始めたときに、オブジェクトがメンバ変数リビングルームの家を持っているので、最初のオブジェクトのリビングルームを親クラスのオブジェクトを作成および初期化されます、リビングルームを作成し、リビングを初期化しますその後、リビングルームのインスタンスを作成し、その後ではない、リビングルームは、2人のメンバーを持っています可変ベッドと机、したがって、定義により、2つのメンバ変数を注文しますが、ベッドと机を作成しました。メンバ変数の初期化が成功した後、リビングコンストラクタ、プリントリビングを行います。初期化が成功のリビングルームの後、家を印刷し、家のコンストラクタを開始しました。
最後に、ヴィラコンストラクタの家の初期化に成功実装した後、ヴィラをプリントアウト。
初期化が成功。
第二に、とき静的メンバ
1 クラスのファミリー{ 2 ファミリー(クラスクラス名){ 3 のSystem.out.println( "オブジェクトファミリを作成" ) 。4 のSystem.out.println(className.getName()); 5 } 。6 } 。7 クラス人{ 8 人( ){ 9。 のSystem.out.println( "Personオブジェクトを作成する" ); 10 } 11 公共 静的ファミリーファミリー= 新しい新規ファミリー(人。クラス)、 12は 静的{ 13れる のSystem.out.printlnは( "コードの静的ブロックは、人を実行" ) ; 14 } 15 { 16 のSystem.out.printlnは( "人物実行コードブロック" ); 17 } 18である } 。19 公共の クラスの学生延び人は{ 20は 公衆学生(){ 21である のSystem.out.printlnは、( "オブジェクト学生の作成します" )。 22は } 23である { 24 のSystem.out.println( "学生実行コードブロック" ); 25 } 26が 静的{ 27 のSystem.out.println( "コード実行学生の静的ブロック" ); 28 } 29 パブリック 静的ファミリーstaticFamily = 新しい新規ファミリー(学生。クラス); 30 @Test 31は、 公共 ボイド試験(){ 32 のSystem.out.println( "=============" ); 33である } 34れます 公共ファミリーファミリー= 新しい新規ファミリー(学生。クラス); 35 } 36 結果: 37 ファミリーオブジェクトの作成 38は com.tca.thinkInJava.chap7.Person 39の 行う者静的コードブロック 40 を行う学生静的コードブロック 41は、 オブジェクトファミリー作成 42 com.tca.thinkInJava.chap7.Student 43は、 実行者のブロック 44 Personオブジェクト作成 45 スチューデントブロック行う 46は オブジェクトファミリ作成 47 com.tca.thinkInJava.chap7.Student 48は、学生オブジェクトを作成
メソッドの実装1.まず@Test、学生は、オブジェクトのインスタンスを作成する必要があります。
対象学生のインスタンスを作成する2.最初のステップは、バイトコード、生徒、親クラスの人と学生のクラスをロードすること、および関連する静的メンバ変数は静的コードブロックを実行し、初期化されます。
まず、親ロードバイトコードのクラスの人、静的メンバ変数のpublic static家族、前のコード文の家族優れた静ブロックなので、静的メンバ変数の最初の家族が初期化されます。、「XXXXXX」「家族を作成するために、オブジェクト」家族のオブジェクト、プリントを作成します。
4.バイトコードの人物をロードした後、バイトコードの学生をロードした後。メンバ変数は、「XXXXXXXXXX」「家族のターゲットの作成」に初期化されながら、「学生静的コードブロックの実行」を静的コード・ブロック、その後staticfamilyのpublic static家族の前に静的メンバを宣言し、我々は最初の静的コードブロックを実行し、印刷。
5.学生は、親クラスの人物のインスタンスを作成し、インスタンスを作成し、最初の非静的メンバ変数とコンストラクタメソッドを実行し、初期化コードブロックを実行します。だから、最初の印刷「のコードブロックの実行者、」[印刷「人物オブジェクトを作成します。」親クラスのオブジェクトが作成され、初期化されます。
6.最初の非静的メンバ変数を学生サブクラスオブジェクトを作成し、初期化コードブロックを実行し、コンストラクタが実行されます。コードブロックの前に声明して、非静的メンバ変数の宣言、コードの最初のブロックは、印刷「学生のコードブロックを実行」した後、家族が初期化されたが、家族のオブジェクトを作成しますので、印刷「家族を作成するためのオブジェクト」、「xxxxxxxxxxx」。
7.テストテスト方法を実行します。
要約:
場合は、静的メンバーの自由、我々の新しいオブジェクトAは、まず最初に親クラスBクラスAのインスタンスを作成し、クラスBクラスCが存在する場合、親は最初のようにクラスCのオブジェクトを作成し、そしてだろう、それがあります再帰を作成するプロセス;クラスの親クラスのオブジェクトがすべて作成され、初期化されているとき、クラスが作成され、初期化されます。クラスが初期化されるときしかし、それは、第1の元のクラスオブジェクト変数のメンバー、および、クラスのコンストラクタを実行します。コードブロックのメンバ変数の初期化および実行順序は、宣言順序によって決定される、または順序に従って初期化を行うが、コンストラクタメソッドの前に実行されます。
静的メンバ場合クラスは、最初のJVMにロードされるとき、静的メンバ変数は一度だけ初期化され、静的コードブロックは、一度だけ実行されます。親クラスの後の最初のバイトコードをロードした後、サブクラスのバイトコードを読み込み、クラスを作成するオブジェクトのインスタンスがある場合、それはバイトコードの親クラスとクラスのクラスにロードされ、クラスをインスタンス化しますしますオブジェクトと親クラスのオブジェクトクラスのインスタンスの例。初期化および実行順序静的コードブロックの静的メンバ変数、順序または初期化を行うによれば、それらの宣言の順序によって決定されます。