クラス内の静的,非静的,構築方法の実行順序について

2963 ワード

public class Text {
	public static int k =0 ;
	public static Text t1 = new Text("t1") ;
	public static Text t2 = new Text("t2") ;
	public static int i = print("i") ;
	public static int n =99 ;
	public int j = print("j") ;
	{
		print("   ");
	}
	static {
		print("   ");
	}
	public Text(String str){
		System.out.println((++k)+":"+str+"   i="+i+"    n="+n) ;
		++i;++n ;
	}
	public static int print(String str){
		System.out.println((++k)+":"+str+"   i="+i+"    n="+n) ;
		++n;
		return ++i ;
	}
	public static void main (String args[]){
		 Text t = new Text("init") ;
	}
}

実行結果は次のとおりです.
1:j i=0 n=0 2:構築ブロックi=1 n=1 3:t 1 i=2 n=2 4:j i=3 n=3 5:構築ブロックi=4 n=4 6:t 2 i=5 n=5 7:i i=6 n=6 8:静的ブロックi=7 n=99 9:j i=8 n=100 10:構築ブロックi=9 n=101 11:init i=10 n=102
この問題では,順次実行し,まずpublic static int=0を実行する.
出力がないのでこれを考慮する必要はなく、続いてpublic static Text t 1=new Text("t 1");
t 1オブジェクトの初期化時に非静的メソッドまたは非静的定数を先に実行し、順次実行し、次に構築パラメータを実行し、
プログラムから見ると3つの記録を印刷すべきで、それぞれ
1:j i=0 n=0 2:構築ブロックi=1 n=1 3:t 1 i=2 n=2
次にpublic static Text t 2=new Text("t 2");同様に、実行が完了した後もstaticコードブロックまたは付与静的変数を実行し続け、main()メソッドではnewの新しいインスタンスがあり、静的変数は1回のみ実行され、次に非静的メソッド---->構築メソッドが順次実行される.
継承関係がある場合、実行順序は次のコードを参照します.
class A{
	public static int k = 0 ;
	static {
		System.out.println("      ") ;
	}
	{
		System.out.println("       ") ;
	}
	public A(){  //  
		System.out.println("    ");
	}
}
class B extends A{
	static {
		System.out.println("      ") ;
	}
	{
		System.out.println("       ") ;
	}
	public B(){  //  
		System.out.println("    ");
	}
}
public class Demo {
	public static void main(String args[]){
		B b = new B() ;
	}
}

出力結果は次のとおりです.
親静的メソッド子静的メソッド親非静的メソッド親構造子非静的メソッド子クラス構造
まとめ:
1/*2*何大原則3*一、静的メンバー変数(Static)4*1、静的メンバー変数はクラス変数であり、すべてのオブジェクトが同じメモリ領域を共有する5*2、静的メンバー変数の宣言と定義は、クラスを最初にロードしたときにのみ6*3を実行し、クラスを最初にロードしたときに、まずすべての静的メンバー変数に対してタイプのデフォルトに従って初期値を付与し、次に右の値が付いた右の値に対して7*二、静的初期ブロック8*1、静的初期化ブロックはクラスを初めてロードしたときに一度だけ実行する9*・・・・複数の静的メンバー変数と静的初期化の速い参照出現順が前後して実行する・・・・10*三、動的メンバー変数11*1、動的メンバー変数定義は、オブジェクトをインスタンス化するたびに関数を構築する前に12*4、動的初期化ブロック13*1、動的初期化ブロックは、オブジェクトがインスタンス化されるたびにコンストラクション関数の前に14*・・・複数の動的メンバー変数と動的初期化ブロック参照の出現順序が前後して実行される・・・15*まとめ:総じて、継承にかかわらずクラスが初めてロードされた場合、以下の順序で16*1、静的メンバー変数定義および静的初期化ブロック17*2は、出現順序に従って前後して実行され、動的メンバー変数定義および動的初期化ブロック18*3は、出現順序に従って前後して実行される.コンストラクション関数19*を実行してオブジェクトを再度インスタンス化する場合は2、3ステップ目のみを実行すれば20*21*・・・・・・メンバー変数と定義と初期化ブロックがコンストラクション関数より先に実行・・・22*5、継承に関わる場合は、以下の手順で23*1、親クラスの静的メンバー変数定義と静的初期化ブロックを実行し、子クラスの静的メンバー変数定義と静的初期化ブロック24*2を実行し、親クラスの非静的メンバー変数定義と動的初期化ブロックを実行し、親クラス構築方法25*3を実行し、子クラスの非静的メンバー変数定義と動的初期化ブロックを実行する.サブクラス構築メソッド26*さらに、親構築メソッドで使用されるメソッドは、すでにクラスに書き換えられている場合、サブクラスオブジェクトを構築する際に親構築関数を呼び出すときにサブクラス書き換えを使用するメソッドです.
転載リンク:http://blog.csdn.net/cherishme1988/article/details/12095637