//この参照エスケープ 問題を引き起こして、この参照にアクセスするには、他のスレッド、及びその初期化されていない変数への更なるアクセスは、そのよう//コンストラクタは、この基準の着自体が外向きに、1の前に完了していない //クラス2.内部外部アクセス初期化されていないクラスのメンバ変数 3 //多重継承は、親クラスのメンバ変数のアクセス初期化されていないサブクラス。 パブリッククラスTestThisEscape { ファイナルINT、 INT = B. 3; 静的TestThisEscape OBJ; 公共TestThisEscape(){ = 3。 ; B = 5; // OBJ =新しい新しいTestThisEscape(); //参照の見かけコンストラクタが原因となり、この基準投げ抜け } パブリック静的無効メイン(文字列[] args){ スレッドスレッドAスレッド新しい新=(Runnableを新しい新(){ @Override 公共ボイドRUN(){ System.out.printlnは( "---------------"); OBJ =新しい新しいTestThisEscape()。 System.out.println( "============"); } }、 "スレッドA"); スレッド新しい新=(Runnableを新しい新しい(){ThreadBスレッド @Override 公共ボイドRUN(){ TestThisEscape OBJ1 = OBJ; // OBJ未初期化完了、これはNULLポインタ原因の使用を指す //試み{ するSystem.out.println(obj1.a); //}キャッチ(例外E){ System.out.printlnは( 。にThread.currentThread()のgetName()+ " 未初期化変数"); //} 試み{ のSystem.out.println(obj1.b); }キャッチ(例外E){ System.out.println(にThread.currentThread()のgetName()+ "B变量未初始化"。)。 } } }、 "threadB")。 threadA.start(); threadB.start(); } }
/ ** *この条件をエスケープ:1.内部クラスのコンストラクタを作成します。2.コンストラクタクラスは、アウト解放この内部参照 * / publicクラスTestInnerClassThisEscape { ファイナルINT A、 INT = B. 3、 列C、 静的TestInnerClassThisEscape OBJ; 公共TestInnerClassThisEscape(){ 新新しいスレッド((Runnableを新しい新){ @オーバーライド 公共ボイドRUNを(){ System.out.printlnは(TestInnerClassThisEscape.this.a) のSystem.out.println(TestInnerClassThisEscape.this.b) のSystem.out.println(TestInnerClassThisEscape.this.c); } })。開始(); 試み{ のThread.sleep(1000); }キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } A = 3。 B = 5。 } パブリック静的無効メイン(文字列[] args){ 新しいTestInnerClassThisEscape()。 } } publicクラスTestThisPC { パブリック静的無効メイン(文字列[] args){ 新しい子()。 } } クラス親{ 親(){ プリント()。 } ボイドプリント(){ System.out.printlnは( "------")。 } } クラスの子供は、親{延び INT A = 5。 ボイドプリント(){ System.out.println( "-----------" + A)。 } 子(){ スーパー(); 印刷(); } }
解決策: 初期設定を呼び出す前に1