面接のこと

1361 ワード

これは坑人の面接問題で、コードを見ています.
 package com.sprone.classloader1;
public class ClassLoader1 {
	public static void main(String[] args) {
		Singleton singleton = Singleton.getInstance();
		System.out.println("a= " + Singleton.a);
		System.out.println("a= " + Singleton.b);
	}
}

class Singleton {
	private static Singleton singleton = new Singleton();// code1
	public static int a;
	public static int b = 0;

	// code2
	private Singleton() {
		a++;
		b++;
	}

	public static Singleton getInstance() {
		return singleton;
	}

}
 
印刷結果は何ですか?code 1のコードをcode 2に切り取った結果は何ですか?
1、0カット後1、1
 
分析:クラスのロード、リンク、初期化プロセス
≪ロード|Load|emdw≫:クラスのバイナリ・データの検索とロード
リンク:検証:ロードされたクラスの正確性を確認する
準備:クラスの静的変数にメモリを割り当て、private static int a=3などのデフォルト値に初期化します.準備フェーズ割当内
メモリ設定0(intのデフォルト)
解析
 
質問1:対象に対応するClassはいつ発生しますか?実行時と仮定すると、JVMの効率はアリのように、JVMチームも実行時にClassオブジェクトを生成することはできません.コンパイル後です.classファイルの中ですべてコンパイルして、すべてのオブジェクトに対応してすべて1つのClassオブジェクトがあって、このClassはバイトコードファイルで解析して、私达にいくつかの生成オブジェクトのインタフェースを提供して、私达のよく使う反射コードの生成はすべてコンパイルする时に生成しました.
 
静的コードブロックシーケンス実行aは、準備フェーズでデフォルト値を与える.code 1を実行したときaは1である.次のコードブロックを続け、後には付与値がなく、a=1であり、bには再付与値が0である.
カット後、newの後に最終的な値が構造方法なので、いずれも1