Все объекты в Java расположены в куче. Я не совсем уверен, что вы подразумеваете под "доступ к объектам из кучи". Единственное, что хранится в стеке, это список функций, которые вызваны в текущий контекст, и их локальные переменные и параметры. Все локальные переменные и параметры являются примитивными типами или ссылками.
Если вы выделяете объект, используя new
(это единственный способ выделить не примитивные типы; да, это включает типы массивов), тогда объект размещается в куче, а ссылка на этот объект сохраняется в либо стек, либо куча, в зависимости от того, хранится ли ссылка в локальной переменной / параметре или как член другого объекта.
При передаче в качестве параметров функциям все объекты передаются по ссылке - если функция изменяет параметр, исходный объект также изменяется. Аналогично, можно также сказать, что ссылки на объекты передаются по значению - если вы измените параметр для ссылки на новый объект, он будет продолжать ссылаться на этот объект в течение всей функции, но исходный объект, который был передан в все равно будет ссылаться на все, что упоминалось ранее. Примитивные типы также передаются по значению.