Javaの親と子のロード順序の詳細

4086 ワード

最近転職の準備をしていて、久しぶりに筆記試験の面接を受けた私は、ネット上でみんなが共有している問題を探して勝手に見ました.それからJavaの親と子のロード順に関する問題があり、簡単なものを出すと選択問題が出て、複雑なものを出すと簡単な解答問題になります.正直、実際の開発作業では使えないようですが(私の技術が家に着いていないので使っていないのかもしれませんが)、筆記試験に対応するためには理解しなければなりません.本題に入りましょう.
1、サブクラスがない場合
package lcy;

public class Test6 {

 /** 
  *     :   —
  *    :   
  *     :2017-8-1   09:01:37 
  *    :   
  *     :2017-8-1   09:01:37 
  *     : 
  * @version V1.0 
  */
  //     
  static String i=lcy();
  public static String lcy()
  {
   System.out.println("      ");
   return "    ";
  }	
  //     
  static {
      System.out.println("       1");
  }
  //     
  static {
      System.out.println("       2");
  }
  //     
  static{
      System.out.println("       3");
  }
  
  //      
  String j=pplcy();
  public String pplcy()
  {
   System.out.println("       ");
   return "       ";
  }	
  //      
  {
    System.out.println("        1");
  }
  //      
  {
    System.out.println("        2");
  }
  //     
  public void bDisplay(){
      System.out.println("       ");
      return ;
  }
  //    
  public static void bTest(){
      System.out.println("      ");
      return ;
  }
  //    
  public Test6(){
      System.out.println("      ");
  }

  
  public static void main (String args[]) {
   Test6 a=new Test6();
   a.bDisplay();
   a.bTest();
   
     }
}

運転結果分析①:
親静的変数
親静的文ブロック1
親静的文ブロック2
親静的文ブロック3
親非静的変数
親非静的文ブロック1
親非静的文ブロック2
親コンストラクション関数
親非静的メソッド
親静的メソッド
結論:クラスを初期化するときは、まずクラスの静的変数と静的文ブロック(コードの上下順に実行)をロードし、次にクラスの非静的変数と非静的文ブロック(コードの上下順に実行)をロードし、最後にクラスの構造関数をロードします.
クラスの静的メソッドと非静的メソッドは、アクティブ呼び出しの場合にのみ実行されます.静的メソッドは、クラス名で直接呼び出すことができます(オブジェクトをインスタンス化しても構いません).静的メソッドではなく、オブジェクトをインスタンス化してから呼び出すことができます.
2、サブクラスがある場合
package lcy;

public class Test7 extends Test6 {

 /** 
  *     :   —
  *    :   
  *     :2017-8-1   09:01:37 
  *    :   
  *     :2017-8-1   09:01:37 
  *     : 
  * @version V1.0 
  */
  //     
  static String a=lcyhh();
  public static String lcyhh()
  {
   System.out.println("      ");
   return "    ";
  }	
  //     
  static {
      System.out.println("       1");
  }
  //     
  static {
      System.out.println("       2");
  }
  //     
  static{
      System.out.println("       3");
  }
  
  //      
  String b=ppplcy();
  public String ppplcy()
  {
   System.out.println("       ");
   return "       ";
  }	
  //      
  {
    System.out.println("        1");
  }
  //      
  {
    System.out.println("        2");
  }
  //     
  public void bDisplay(){
      System.out.println("       ");
      return ;
  }
  //    
  public static void bTest(){
      System.out.println("      ");
      return ;
  }
  //    
  public Test7(){
      System.out.println("      ");
  }
  
}

運転結果分析②:
Test6 a=new Test6();//親Test 6で結果を実行し、
運転結果分析①全く同じ
Test6 a=new Test6();//サブクラスTest 7での実行結果は以下の通りです.
親静的変数
親静的文ブロック1
親静的文ブロック2
親静的文ブロック3
サブクラス静的変数
サブクラス静的文ブロック1
サブクラス静的文ブロック2
サブクラス静的文ブロック3
親非静的変数
親非静的文ブロック1
親非静的文ブロック2
親コンストラクション関数
結論:親Test 6を初期化する際、まず親の静的変数と静的文ブロック(コードの上下順に実行)をロードし、次に子の静的変数と静的文ブロック(コードの上下順に実行)をロードし、次に親の非静的変数と非静的文ブロック(コードの上下順に実行)をロードし、最後に、親のコンストラクション関数をロードします.
運転結果分析③:
Test7 a=new Test7();//親Test 6と子Test 7では、次のような結果が得られます.
親静的変数
親静的文ブロック1
親静的文ブロック2
親静的文ブロック3
サブクラス静的変数
サブクラス静的文ブロック1
サブクラス静的文ブロック2
サブクラス静的文ブロック3
親非静的変数
親非静的文ブロック1
親非静的文ブロック2
親コンストラクション関数
サブクラス非静的変数
サブクラス非静的文ブロック1
サブクラス非静的文ブロック2
サブクラスコンストラクタ
結論:サブクラスTest 7を初期化する際、まず親の静的変数と静的文ブロック(コードの上下順に実行)をロードし、次に子の静的変数と静的文ブロック(コードの上下順に実行)をロードし、次に親の非静的変数と非静的文ブロック(コードの上下順に実行)をロードし、親のコンストラクション関数を再ロードします.次に、サブクラスの非静的変数と非静的文ブロックをロードし(コードの上下順に実行)、最後にサブクラスの構造関数をロードします.
PS:親でも子でもロード(
静的変数と静的文ブロック
)は一度しかロードできません.
親でも子でもロード(非
静的変数と非静的文ブロックと構造関数
)を繰り返してロードできます.