Поскольку доступ к переменной позволил бы вам изменить ее и сломать строку.
И JIT-компилятор достаточно умен, чтобы встроить геттер для вас, поэтому вы фактически просто получаете доступ только кпеременная в любом случае.
Да, и array.length не является «реальной» переменной объекта, а скорее языковой функцией, позволяющей получить доступ к длине массива.Из-за этого это не доступно для записи.С другой стороны, строки являются «обычными» объектами и не обрабатываются специальным образом, будь то компилятор (хотя они и создаются несколько на лету при использовании литералов String в исходном коде).