クラスローディングの初期化

初期化フェーズは、実装クラスコンストラクタ<clinit>()メソッドで、クラスコンストラクタ<clinit>()メソッドは、すべてのクラス変数および文(静的ブロック)の静的ブロックコンパイラ自動的に収集クラスによってコピー動作であるに合併の声明

クラスを初期化するとき、あなたが親クラスが初期化されていない見つけた場合、あなたは親クラスのトリガーの初期化に必要

Javaクラスの静的フィールドにアクセスすると、このフィールドの唯一の本当のステートメントは、クラスを初期化されます

public class Demo01 {
	static{
		System.out.println("静态初始化Demo01");
	}
	
	
	public static void main(String[] args) throws Exception {
		System.out.println("Demo01的main方法!");
		System.out.println(System.getProperty("java.class.path"));
		
		//主动引用
		new A();
//		System.out.println(A.width);
//		Class.forName("com.bjsxt.test.A");
		
		
		//被动引用
//		System.out.println(A.MAX);
//		A[] as = new A[10];
//		System.out.println(B.width);
		
	}
}

class B  extends A {
	static {
		System.out.println("静态初始化B");
	}
}

class A extends A_Father {
	public static int width=100;   //静态变量,静态域    field
	public static final  int MAX=100; 
	
	static {
		System.out.println("静态初始化类A");
		width=300;
	}
	public A(){
		System.out.println("创建A类的对象");
	}
}

class A_Father extends Object {
	static {
		System.out.println("静态初始化A_Father");
	}
}
  • クラスへのアクティブな参照(クラス初期化が起こります)

-オブジェクトの新しいクラスは、
- (最終定数を除く)、静的メンバクラスを呼び出し、静的メソッド
- java.lang.reflectのパッケージのアプローチを使用して、クラスの呼び出しを反映するために、
仮想マシンは、Javaこんにちは、クラスが初期化されますこんにちは、電源投入時- 。これは、最初のmainメソッドクラス開始を意味
最初の初期化、親クラスが初期化されていない場合、クラスが初期化された彼のクラスの父-

  • クラスへのパッシブリファレンス(クラスの初期化は発生しません)

-このフィールドの実際の文が初期化されますと同じように、静的フィールドにアクセスして、その参照親クラスのサブクラスによる静的変数は、サブクラスの初期化にはつながらない場合は
-カスタムクラスの配列によって参照、このクラスは誘発しません初期化
-定数参照は、そのような初期化をトリガしないであろう(クラスコールの定数プールへのコンパイルを時定数)

 

クラス<clinit>()メソッドが正しくマルチスレッド環境でロックと同期していることを確実にするために、仮想機会

飢えデザインパターンのシングルトンデザインパターン:

1.プライベートコンストラクタ(外の世界はオブジェクトを作成できないことを確実にするため)

2.このクラスの参照型の変数を宣言して、オブジェクトを作成します(オブジェクトがあなた自身を作成し​​ていることを確実にするために)

3.異なるオブジェクトを介して外部の世界は(パブリックでなければなりません)呼び出すことができることを確実にするための静的メソッドを提供します

//饿汉设计模式

public class Single {

//私有化构造

private Single(){}

//创建本类对象
//当饿汉式类被主动引用时,初始化并构建对象,即使是多线程环境下<clinit>()方法也能保证只有一个对象被创建

private static Single single = new Single();

//提供一个公共的方法方式

public static Single getInstance() {

return single;

}

}

 

シングルトンデザインパターンデザインパターン怠惰:

1.プライベートコンストラクタ(外の世界はオブジェクトを作成できないことを確実にするため)

2.このクラスの参照型の変数を宣言しますが、オブジェクトを作成しないために

3.外の世界は、電話をかけることがオブジェクトの上に異なることができますが、オブジェクトを作成しようとしているときにメソッドを呼び出す必要がありますことを確実にするための静的メソッドを提供します

//懒汉单例设计模式

class Single02{

//私有化构造

private Single02(){}

//创建本类对象

private static Single02 single;

public static Single02 getInstance() {

if(single == null) {

single = new Single02();

}

return single;

}

}

空腹中国風のクラスロード時にインスタンス化するには、同時に、クラスがロードされたときにその変数の値の例を取るために、スレッドセーフであると言われても、スレッド1とスレッド2 GETそれならば、スレッド安全ではないと怠惰​​な男(インスタンス== nullの)は、本体に入力された場合にtrueを決定しますが、任意のインスタンス化起動しないが、今回もスレッド2が来た場合、それはスレッド1で可能となるため、最終的に2つのインスタンスが存在します。

出版元の記事 ウォンの賞賛0 ビュー26

おすすめ

転載: blog.csdn.net/qq_38374633/article/details/104033818