インスタンスブロックとコンストラクターについて疑問があります。インスタンスブロックは常にコンストラクターの前に実行されることを学びました。
ただし、インスタンス変数にアクセスしようとしたり、「this」を使用しようとしても、エラーは発生しません。しかし、オブジェクトが作成される前であっても、インスタンス変数にアクセスするにはどうすればよいですか。
インスタンスブロックは常にコンストラクターの前に実行されることを学びました。
それなら、あなたは間違って学んでいます。そうではありません。これらは、暗黙的な super() 呼び出しの後、コンストラクター中に実行されます。
コンストラクターは実際にはオブジェクトを作成しないため、指定したパラドックスは実際には存在しません。コンストラクターは、以前に割り当てられたオブジェクトでのみ実行されます。
ただし、new
コンストラクターの呼び出しに使用されるオペレーターは、オブジェクトの作成とそのコンストラクターの呼び出しの両方のタスクを 1 つのアトミック操作で実行します。
また、Java コンパイラは、インスタンス ブロックに含まれるコードを各コンストラクタに効果的に追加することでインスタンス ブロックを実装するため、呼び出されるコンストラクタの一部としても実行されます。
これは、オブジェクトの存続期間の開始時に、Java 仮想マシン (JVM) がオブジェクトのインスタンス変数を収容するのに十分なメモリーをヒープに割り当てるためです。ただし、そのメモリが最初に割り当てられるとき、そこに含まれるデータは予測できません。メモリをそのまま使用すると、オブジェクトの動作も予測できなくなります。このようなシナリオを防ぐために、Java は、メモリがコードによって使用される前に、少なくとも予測可能なデフォルト値にメモリが初期化されるようにします。