Javaのサブクラス親コンストラクション関数および静的文ブロックロード

2191 ワード

最近仕事を探していて、前にアリババのキャンパスの招聘の筆記試験にも参加して、中の最後の2番目の問題はJavaの中で関数を構築して、静的な変数と静的な文のブロックのロードの問題についてです.そこで、弟は自分でJavaのサブクラスの親構造関数と静的文ブロックの問題について、実践して操作して、分かち合ってみんなに見せました.
一、Javaのサブクラスの親構造関数の問題
       まず例を見てみましょう.
  • public class Child extends Father{
    
    	public Child(String s){
    		System.out.println("     ");
    	}
    	
    	public Child(){
    		System.out.println("     ");
    	}
    	    
    //      static{
    //              System.out.println("     ");
    //      }
        
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Child child = new Child("child_one");
    	}
    
    }
    
    class Father{
    	
    	public Father(){
    		System.out.println("     ");
    	}
    	
    	public Father(String s){
    		System.out.println("     ");
    	}	
    
    //     static{
    //              System.out.println("     ");
    //    }
    
    }

  • 実行結果:
    親パラメータなしサブクラスパラメータあり
            説明:mainメソッドでは、サブクラスChildのパラメトリック構造関数を使用してオブジェクトを作成し、親クラスFatherのパラメトリック構造関数なしを呼び出し、パラメトリック構造関数を呼び出しません.
    ケース1:親Fatherの無パラメトリック関数を注釈して説得力を表現するために、子系列Childの無パラメトリック関数も注釈してしまうと、その時点でエラーとなります.
                  Problem:暗黙的な超構造関数Father()は定義されていません.別のコンストラクタを明示的に呼び出す必要があります
             これは、前述した実行結果も示しています.
    ケース2:親Fatherのパラメトリック構造関数のみをロードしたい場合は、パラメトリック構造関数なしではなく、どうすればいいですか?このときsuperは機能し,サブクラスChildのパラメトリック構造関数を以下のように修正する.
    	    public Child(String s){
    		   super(s);         //     
    		   System.out.println("     ");
    	    }

                再実行、実行結果:
             親にパラメータがある         サブクラスにパラメータがあります
             ちなみに、クラス自体のコンストラクション関数間で呼び出され、thisキーが使用されます.
    二、Java静的文ブロックと構造関数のロード順序
            静的部分はクラスのロードに伴ってロードされ、コンストラクション関数はオブジェクトの作成に伴ってロードされるため、詳細には言う必要はありません.すなわち,mainメソッドではサブクラスChildタイプの変数のみを音明すると,静的部分が実行され,もちろん構造関数は存在しない.次に,サブクラスChildが親クラスFatherを継承する場合にのみ,静的ブロックとコンストラクション関数のロード順序を示したい.
            文書の開始コードの静的文ブロック部分にコメントを削除し、次のように実行します.
            親静的ブロック        サブクラス静的ブロック        親パラメータなし        サブクラスにパラメータがあります
            すなわち、親クラスでも子クラスの静的部分でも、クラスのロードに伴ってロードされる関数を構築する前に実行されます.親は子より先にロードされたに違いない.猿が先にいてこそ、人がいるのと同じだ.