Javaインフラストラクチャオブジェクト初期化変数の順序の概要

2804 ワード

import java.util.Scanner;



public class Main {



	public static void main(String[] args) {

		Scanner cin = new Scanner(System.in);

		A b = new B(8);

		System.out.println(A.aa + " " + B.bb);

	}

}



class A {

	int a = f();

	static int aa = sf();

	static {

		aa = 11;

		System.out.println("A kuai static " + aa);

	}

	{

		aa = 111;

		a = 1;

		System.out.println("A kuai " + a);

	}



	A() {

		System.out.println("A constract begin. " + a);

	}



	A(int r) {

		System.out.println("A constract begin. " + a);

	}



	int f() {

		System.out.println("A kuai f");

		return 2;

	}



	static int sf() {

		System.out.println("A kuai sf");

		return 22;

	}

}



class B extends A {

	static int bb = sfun();

	int b = fun();

	static {

		bb = 44;

		System.out.println("B kuai static " + bb);

	}

	{

		b = 4;

		System.out.println("B kuai " + b);

	}



	B() {

		System.out.println("B constract begin. " + b);

	}



	B(int r) {

		System.out.println("B constract begin." + b);

	}



	int fun() {

		System.out.println("B kuai fun");

		return 3;

	}



	static int sfun() {

		System.out.println("B kuai sfun");

		return 33;

	}

}

/*

A kuai sf

A kuai static 11

B kuai sfun

B kuai static 44

A kuai f

A kuai 1

A constract begin. 1

B kuai fun

B kuai 4

B constract begin.4

111 44

*/


初期化順序:
親の静的変数、子の静的変数、親のインスタンス変数、親の構築方法、子のインスタンス変数、子の構築方法
静的変数の初期化:
1).定義時、2)静的ブロック;初期化順序は、コード内の順序で初期化されます.
インスタンス変数の初期化:
1).定義時、2)静的ブロック,3).構造方法
ここで1,2は3)より先に実行され,1,2についてはコード中の順序で実行される.
いずれも先に定義し、メモリを開き、初期値(null,0など)を付与し、最後に付与文に従って付与し、最終的な値です.
 
import java.util.Scanner;



public class Main {



	public static void main(String[] args) {

		Scanner cin = new Scanner(System.in);

		System.out.println(A.sf());

	}

}



class A {

	static A Aa = new A(2);

	static int aa = 11;

	int a = 1;

	static {

		System.out.println("static " + aa);

	}

	{

		System.out.println("A kuai " + a);

	}



	A() {

		sf();

		System.out.println("A constract begin. " + a + " " + aa + " " + " "

				+ sf());

	}



	A(int r) {

		sf();

		System.out.println("A constract begin. " + a + " " + aa + " " + " "

				+ sf());

	}



	int f() {

		System.out.println("A kuai f " + a);

		return a;

	}



	static int sf() {

		System.out.println("A kuai sf " + aa);

		return aa;

	}

}

/*

A kuai 1

A kuai sf 0

A kuai sf 0

A constract begin. 1 0  0

static 11

A kuai sf 11

11

 */


A kuai 1
どうして出力するの?なぜ静的変数は0なのか、インスタンス変数には値があるのか. 
これで上の説明と矛盾しているのではないでしょうか.わからない?通りすがりの大牛に指導してもらいます!ありがとう!