サブクラスコンストラクタを呼び出してサブクラスオブジェクトを初期化することを理解すると、親コンストラクタは常にサブクラスコンストラクタの前に実行されます.

1516 ワード

サブコンストラクタは、super呼び出しを使用して親コンストラクタの初期化コードを実行するかどうかにかかわらず、親コンストラクタを1回呼び出します.サブクラスコンストラクタが親クラスコンストラクタを呼び出すには、次のような状況があります.
  • サブクラスコンストラクタ実行体の最初の行はsuperを使用して親クラスコンストラクタを明示的に呼び出し、システムはsuper呼び出しに入力された実パラメータリストに基づいて親クラスに対応するコンストラクタを呼び出す.
  • サブクラスコンストラクタ実行体の最初の行コードは、thisを使用してクラスにリロードされたコンストラクタを明示的に呼び出し、システムはthis呼び出しに入力された実パラメータリストに基づいてクラスの別のコンストラクタを呼び出す.このクラスの別のコンストラクタを実行すると、親コンストラクタが呼び出されます.
  • サブクラスコンストラクタ実行体にはsuper呼び出しもthis呼び出しもなく、サブクラスコンストラクタを実行する前に、親クラスのパラメータのないコンストラクタが暗黙的に呼び出されます.

  • いずれの場合も、サブクラスコンストラクタを呼び出してサブクラスオブジェクトを初期化すると、親コンストラクタは常にサブクラスコンストラクタの前に実行されます.それだけでなく、親コンストラクタを実行すると、システムは再び親コンストラクタを遡及して実行する......このようにして、Javaオブジェクトを作成し、最初に実行するのはjavaである.lang.Objectクラスのコンストラクタ.
     
    /**
     *   :                 ,                 
     * @author LiuYP_1024
     *
     */
    class Creature{
    	public Creature() {
    		System.out.println("Creature       ");
    	}
    }
    
    class Animal extends Creature{
    	public Animal(String name) {
    		System.out.println("Animal         ,    name "+name);
    	}
    	public Animal(String name,int age) {
    		//    this           
    		this(name);
    		System.out.println("Animal         , age "+age);
    	}
    }
    
    public class Wolf extends Animal{
    	public Wolf() {
    		super("   ",3);
    		System.out.println("Wolf       ");
    	}
    	
    	public static void main(String[] arge) {
    		new Wolf();
    	}
    }
    

    実行結果は次のとおりです.
    Creature       
    Animal         ,    name    
    Animal         , age 3
    Wolf       

     
    内容整理は、クレイジーJavaの講義から