Ответ
Да, но не напрямую. Примитивные типы по умолчанию хранятся в стеке вызовов, однако они могут оказаться в куче в двух случаях:
-
Как поле объекта. Если примитив является полем класса, он хранится в куче вместе с экземпляром этого объекта.
class Person { int age; // Значение 'age' хранится в куче внутри объекта Person. } -
В результате автоупаковки. Когда примитив используется в контексте, требующем объект (например, добавление в коллекцию
Collection<Integer>), он автоматически упаковывается в соответствующий класс-обертку (например,int->Integer), и этот объект размещается в куче.List<Integer> numbers = new ArrayList<>(); numbers.add(42); // Примитив 42 упаковывается в объект Integer и помещается в кучу.
Таким образом, примитив всегда хранит само значение, но это значение может находиться и в стеке (как локальная переменная), и в куче (как часть объекта или упакованный объект).