Well, I understand your frustration, but a certain amount of abstraction frees you to concentrate on the things that matter, and not get lost in details. I think it's important to understand the difference between a stack and the heap, that all variables aside from primitives hold references that can be used to locate an object on the heap, and that all objects are stored on the heap. How objects are actually located using the reference value is up to the implementer of the JVM, and you understand the concept of how it works, without necessarily understanding the details.
Henry has a good point that the reference might contain the physical memory address of the object, which would be just like a pointer. However, unlike a pointer in C, for example, you can't do arithmetic on a reference to find nearby objects in the heap. For all intents and purposes, the reference is a random, but unique value that lets the JVM find your object. Many variables can hold the same reference value, in which case they are referring to the same object. An object created in a method lives in the heap and survives even after the method completes. If it was assigned to a local variable in that method, then the reference was on the stack, and is gone after the method completes. The job of the Java garbage collector is to examine the heap looking for objects that have no references either on the heap or in an active stack, and removing them. How it does that is another thing that
you should understand in concept, though not necessarily in detail.