Todos los objetos en Java se encuentran en el montón. No estoy muy seguro de lo que quiere decir con "acceder a los objetos desde el montón". Las únicas cosas almacenadas en la pila son la lista de funciones que se llama en el contexto actual y sus variables y parámetros locales. Todas las variables y parámetros locales son tipos primitivos o referencias.
Si asigna un objeto usando new
(que es la única forma de asignar tipos no primitivos, sí esto incluye tipos de matriz), entonces el objeto se asigna en el montón, y una referencia a ese objeto se almacena en cualquiera la pila o el montón, dependiendo de si la referencia se almacena en una variable/parámetro local o como miembro de otro objeto.
Cuando se pasan como parámetros a las funciones, todos los objetos se pasan por referencia; si la función modifica el parámetro, el objeto original también se modifica. De forma idéntica, también podría decirse que las referencias a objetos se pasan por valor: si cambia un parámetro para referirse a un nuevo objeto, continuará refiriéndose a ese objeto durante la duración de la función, pero el objeto original que se pasó en seguirá refiriéndose a lo que se refirió antes. Los tipos primitivos también se pasan por valor.
Buena pregunta - Desearía saber más acerca de Java; una buena respuesta a esto será un comienzo para mi iluminación :) –