I assume that you are using this (or similar) documentation: http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html
I have just experimented with this and it appears that the offset really is always zero for the base class:
java.nio.ByteBuffer bb = java.nio.ByteBuffer.wrap("The dog chased the cat".getBytes());
System.out.println("offset test: " + bb.arrayOffset());
bb.putChar(5, 'Z');
System.out.println("offset test: " + bb.arrayOffset());
bb.getChar(5);
System.out.println("offset test: " + bb.arrayOffset());
Note that java.nio.ByteBuffer is an abstract class, and I used the static wrap method to create an instance of the class java.nio.HeapByteBuffer (documentation is here http://www.docjar.org/docs/api/java/nio/HeapByteBuffer.html)
The documentation for ByteBuffer says that the implementation of arrayOffset is optional, and the default for non-implementors might always be zero.
When in doubt, get the source code for the Java standard libraries to browse in an IDE like IntelliJ or Eclipse.