Если вы попытаетесь инициализировать переменную значением, превышающим ее значение (независимо от числовой формы значения), компилятор выдаст вам сообщение об ошибке.
char c = 0xffff; // max char hex value
byte b = 0x7f; // max byte hex value
short s = 0x7fff; // max short hex value
Обратите внимание на приведенный выше код максимально возможных шестнадцатеричных значений для char, byte и short.Если вы превысите их, компилятор автоматически сделает значение int и скажет вам, что вам нужно сужающее приведение для назначения.Вы будете знать, что переступили черту.
Так что в вашем случае Short s = 3
фактически становится Short s = new Short(3)
и работает.(Методы valueOf не используются при автобоксировании, поэтому современные IDE имеют опции, чтобы пометить эти автобокс как ошибки, и мы можем заменить их методом valueOf для лучшего мгновения памяти)стать Float.valueOf(3)