Thinking In Java (4th Edition), by Bruce Eckel