Object References
A reference in Java is an abstract handle. It points to a memory address in the heap. The JVM hides the inner details though. You can't get the actual address.

Different ways only to link reference variable to actual address
Java offers several ways to link a reference variable to the real memory address. The variable may use an offset address, a direct address, and more.
Still, all of them share the same abstract design. You can't get the inner reference details.
Reference Variable to Memory Address
- Old JVM versions - an in-between table holds the link to the direct memory address. Every reference variable has an entry in this table.
- Compressed Ordinary Object Pointers (Compressed OOPS) - The reference holds the actual address. But it's an offset from the start of the heap. This avoids 64 bit address pointers.
- Direct Pointer - The reference points to the direct address in the heap.
Passing Reference in Methods
Object references are passed to methods by value. Java copies the reference, not the object. Changes to the object inside the method affect the original object. Changes to the reference itself don't though. For example, assigning a new object to it doesn't affect the original reference.