現在、ほとんどの JVM は「オンデマンド」方式でクラスをロードするため、Java プログラムを開始すると、JVM はアクティブな参照に基づいて必要に応じて .class ファイルを読み込みます。(それよりも複雑ですが、簡単にするために、現実に近いと仮定します。) ロードされると、ディスク上のバイトは JVM 内部表現に変換されてメモリに保持されるため、不要になります。事実上、いったんクラスがロードされると、それらをディスク上に置く必要はなくなります (まったく同じプログラムをゼロから実行することは二度とないと仮定します!)。
ただし、大きな問題があります...プログラムのすべてのクラスが実際に平均的な実行で読み込まれるわけではありません。特殊な状況でのみ必要となるエラー クラスを想像してみてください。通常の実行ではロードされないため、プログラムが「通常」に実行されているときにファイル システムからすべてを単純に削除し、後でクラスのロードが必要なエラー状態に陥った場合、JVM は二重のエラーで失敗します。悪い方法 - 予想される例外 (通常は catch ブロックを介して処理される) をスローするのではなく、より深刻なエラーが発生し、ロジックが脱線します。
すべてのクラスを「プリロード」することは可能ですが、これはちょっとしたハックであり、通常は、アプリ内のすべてのクラスのリストを保持し、それぞれに対して「Class.forName()」を実行するなどの手間で実現されます。パフォーマンス上の理由で人々がどのようにそれを行うかについては、この SO記事を参照してください。