への参照はB.x
、次のバイトコードを発行します。
getstatic #3 <Field int B.x>
Java 仮想マシンの仕様によると
Java 仮想マシン命令 anewarray、checkcast、getfield、
getstatic、instanceof、invokedynamic、invokeinterface、invokespecial、invokestatic、invokevirtual、ldc、ldc_w、multianewarray、new、putfield、および putstatic は、ランタイム定数プールへのシンボリック参照を作成します。これらの命令を実行するには
、そのシンボリック参照を解決する必要があります。
したがって、JVM は へのシンボリック参照をB.x
解決する必要があります。フィールド解像度は次のように指定されます。
D からクラスまたはインターフェイス C のフィールドへの未解決のシンボリック参照を解決するには、フィールド参照によって指定された C へのシンボリック参照を最初に解決する必要があります (§5.4.3.1)。
...
フィールド参照を解決するとき、フィールド解決は最初に C とそのスーパークラスで参照されたフィールドを検索しようとします:
C がフィールド参照で指定された名前と記述子でフィールドを宣言すると、フィールド ルックアップは成功します。宣言されたフィールドは、フィールド ルックアップの結果です。
それ以外の場合、フィールド ルックアップは、指定されたクラスまたはインターフェイス C の直接のスーパーインターフェイスに再帰的に適用されます。
それ以外の場合、C がスーパークラス S を持っている場合、フィールド ルックアップが再帰的に S に適用されます。
それ以外の場合、フィールド ルックアップは失敗します。
つまり、JVM は に解決B.x
されA.x
ます。A
これが、クラスのみをロードする必要がある理由です。