Most programmers today don't really understand how a compiler/interpreter works, how to write assembler, how to allocate/free memory, or even a solid understanding of data structures yet work somehow gets done.
I personally think that an abstraction is useful when it helps me to focus on the essentials of completing a task and allows me to ignore the irrelevant, but allowing me to ignore it today doesn't mean I need never understand it.
As an example, I was the development manager for a tool called JProbe. One of its fine tools was useful for identifying memory leaks in Java programs. We had a devil of a time explaining to people what a memory leak was and how a Java program could have a memory leak despite not having any of those complicated pointer thingummies.
To a great extend, Java's memory manager provided value by allowing a programmer to think about other things most of the time. You be the judge of whether Java programmers ought to know how memory works and what a reference is, and the difference between a strong and a weak reference, and how it is that a program with no pointers can have a memory leak.