Java基礎学習1

2223 ワード

Javaのロード順序は以前はあまり深く研究されていなかったが、この間「s仮想マシンを深く研究する」を見て、ロード順序をテストした.
コード#コード#
/**
*

Description:TODO


*
* @author esdong
* 2015-10-14
*/
public class TestLoad {
public static TestLoad test = new TestLoad();
public static int a = 1;
public static int b = 2;
public int c = 1;
private TestLoad(){
a ++;
b ++;
c ++;
}

public static TestLoad getInstence (){
return test;
}

public static void main(String[] args) {
TestLoad test1 = TestLoad.getInstence();
System.out.println(test1.a);
System.out.println(test1.b);
System.out.println(test1.c);
}
}

実行結果テスト結果は、以前理解していたのと同じです.
[b]結果:[/b]
初期化----
1
2
2
想像していた2,3,2ではありません
これは確かに仮想マシンのロード方法とは異なり、順序は
1、初期化時、TestLoad test=null、int a、int bはjavaスタックに入れられ、この時aとbはいずれも初期値0である.クラス情報、静的メソッド.メソッド修飾など後悔してメソッドゾーンに入れられる
2、new TestLoad()の初期化方法を実行し、この場合aとbはいずれも1であり、
3、静的変数をロードして、この時aとbは再び値を割り当てて、
4、インスタンス変数の場合、いつ呼び出されても、呼び出されたときにメモリ領域が生成されます.したがって、cが呼び出されると、メモリ領域が割り当てられ、値が割り当てられるので、最初は1である.
コードを修正するとロード順序が完全にわかります
public class TestLoad {

public static TestLoad test = new TestLoad();
public static int a = 1;
public static int b = 2;
public int c = 1;
{
System.out.println(a);
System.out.println(b);
System.out.println(c);
}

static{
System.out.println(" ----");
}

private TestLoad(){
System.out.println(" ----");
a ++;
b ++;
c ++;
}

private void test(){
System.out.println(" test----");
}

public static TestLoad getInstence (){
System.out.println(" ---");
return test;
}

public static void main(String[] args) {
TestLoad test1 = TestLoad.getInstence();
test1.test();
System.out.println(test1.a);
System.out.println(test1.b);
System.out.println(test1.c);
}
}

出力結果:
0
0
1
----
----
---
test----
1
2
2