Java stores logical references to objects, but these do not necessarily correspond directly to areas of memory.
This means that there is no longer any direct access to memory through a pointer. Specific areas of memory can still be directly accessed by writing a native library DLL or .so shared object extension which is then “wrapped” by java code.
Trap: Native library extensions immediately introduce a portability problem to your application, albeit a smaller problem than would exist in a compiled C++ program. Also, they're pretty difficult to debug when there's a problem.