Thinking in Java - Bruce Eckel