Еще один способ доказать, что такое поведение - смотреть на сгенерированный байт-код.Когда константа «мала» (предположительно <128): </p>
public B();
Code:
0: aload_0
1: invokespecial #10; //Method java/lang/Object."<init>":()V
4: aload_0
5: bipush 42
7: anewarray #3; //class java/lang/Object
10: putfield #12; //Field temp:[Ljava/lang/Object;
13: return
}
(я использовал 42 вместо 100, поэтому он выделяется больше).В этом случае он явно подставляется в байт-код.Но, скажем, константа «больше».Затем вы получите байт-код, который выглядит следующим образом:
public B();
Code:
0: aload_0
1: invokespecial #10; //Method java/lang/Object."<init>":()V
4: aload_0
5: ldc #12; //int 86753098
7: anewarray #3; //class java/lang/Object
10: putfield #13; //Field temp:[Ljava/lang/Object;
13: return
Когда он больше, используется код операции "ldc", который согласно документации JVM"является неподписанным байтом, который долженбыть действительным индексом в пуле констант времени выполнения текущего класса ".
В любом случае константа встроена в B. Я думаю, поскольку в кодах операций вы можете получить доступ только к пулу констант времени выполнения текущих классов,что это решение записать константу в файл класса не зависит от реализации (но я не знаю, что на самом деле).