JAvaインスタンス化

7360 ワード

イニシャルブロック
  • 実際には、初期化ブロックは仮想であり、javacコマンドを使用してjavaクラスをコンパイルすると、初期化ブロックは消失し、初期化コードは各コンストラクタのコードの一番前の
  • に復元される.
  • インスタンス化中:前の初期化ブロックが先に実行され、後の後に
  • が実行される.
  • 初期化ブロックの修飾子はstatic
  • のみである.
  • 通常初期化ブロックはオブジェクトの初期化を担当し、静的初期化ブロックはクラスの初期化を担当する
  • .
  • 初期化ブロックはjavaオブジェクトの作成時にのみ暗黙的に実行する、コンストラクタの前に
  • を実行する.
    Javaオブジェクトを作成するときの初期化順序は、次のとおりです.
    1.クラス1のロード時:
  • 最上位の親の静的初期化コードを先に実行し、間接的な親の静的初期化コードを下に遡って実行し、最後に直接的な親の静的初期化コードを実行する.
  • 静的初期化ブロックと静的メンバー変数を宣言するときに指定される初期値は、ソースコードの書き込み順序と同じ実行順序でクラスに与えられる静的初期化コードです.

  • 2、次にオブジェクトのインスタンス化を開始する
  • 初期化ブロックを先に実行するか、インスタンス変数を宣言するときに指定された初期値(両方の実行順序はソースコードの書き込み順序と同じ)、
  • .
  • コンストラクタのコードを再実行します.

  • 例:
     1 class Root{
     2     static {
     3         System.out.println("Root       ");
     4     }
     5     
     6     {
     7         System.out.println("Root       ");
     8     }
     9     
    10     public Root() {
    11         System.out.println("Root      ");
    12     }
    13     
    14 }
    15 
    16 class Mid extends Root{
    17     static {
    18         System.out.println("Mid       ");
    19     }
    20     
    21     {
    22         System.out.println("Mid       ");
    23     }
    24     
    25     public Mid() {
    26         System.out.println("Mid      ");
    27     }
    28     
    29     public Mid(String msg) {
    30         this();
    31         System.out.println("Mid      ,    :" + msg);
    32     }
    33     
    34 }
    35 
    36 class Leaf extends Mid{
    37     static {
    38         System.out.println("Leaf       ");
    39     }
    40     
    41     {
    42         System.out.println("Leaf       ");
    43     }
    44     
    45     public Leaf() {
    46         super("  java");
    47         System.out.println("Leaf      ");
    48     }
    49 }
    50 
    51 public class Test {
    52     public static void main(String[] args){
    53         new Leaf();
    54         new Leaf();
    55     }
    56 }

    実行結果:
    Root       
    Mid       
    Leaf       
    Root       
    Root      
    Mid       
    Mid      
    Leaf       
    Leaf      
    Root       
    Root      
    Mid       
    Mid      
    Leaf       
    Leaf      

    プログラム実行フロー:Rootの静的初期化ブロック-->
    Midの静的初期化ブロック-->
    Leafの静的初期化ブロック-->
    Testクラスnew Leaf()に戻ります-->
    Leaf無パラメトリック構造へ -->
    superがMidに入るにはパラメトリック構造があります-->
    これはMId無パラメトリック構造に入ります-->
    superはRoot無パラメトリック構造に入ります-->
    Root初期化ブロックに入って印刷を実行-->
    Super無パラメトリック構造に入り、印刷を実行-->
    Mid通常初期化ブロックに入って印刷を実行-->
    MId非パラメトリック構造に入り、印刷を実行-->
    Midパラメトリック構造に入って印刷を実行-->Leaf初期化ブロックに入って印刷-->
    Leaf無パラメトリック印刷に入ります-->......