This is the first book on this topic that I can recommend at all, but I am happy to do so wholeheartedly.
This is yet another book that aims to teach programming to students using Java as a vehicle. I have reviewed a couple of books previously which have the same goal, both of which were miserable failures, so I was somewhat apprehensive about this one, even though in the past I have been generally impressed by Cay Horstmann's Java books. The problem in trying to teach programming using any one language is in untangling the computing concepts from thespecifics of that language. A person learning about programming using Java has different requirements and priorities to one coming to Java already knowing another language. Horstmann appears to have written this book with that central fact in mind all the way. Despite the fact that he has written a similar title based on C++, this book does not read like an adaptation of an earlier work. This is the first book on this topic that I can recommend at all, but I am happy to do so wholeheartedly. Horstmann takes care to introduce topics in a logical fashion without overwhelming or boring the reader. He introduces object-oriented concepts without treating them as gimmicks or frills and he understands the importance, when dealing with be-ginners, of demystifying the development process itself, e.g. he devotes a whole, very worthwhile, chapter to the issue of testing and debugging.
One of the notable errors in many elementary books is the tendency to introduce unnecessary complexity too early. Java has a problem in this respect, in that the amount of code to create the simplest programs can be overwhelming to a beginner. One route to avoiding this is to use `little languages`, which have a syntax carefully matched to the concepts being taught. Horstmann chose instead to stick to Java (while deliberately avoiding some constructs) and provide a class library with a simpler API than the standard one. This involves some occasional manoeuvring along the lines of `just do it this way and don't worry too much how it works for now', but he keeps this to an acceptable level.
One of the nice things about this book is the frequent leavening with optional sections such as 'Productivity Hints' and 'Random Facts'. The former give much-needed advice about practical topics such as back-ups, while the latter provide historical background material, including some classic anecdotes which help to bring the subject matter to life. Another plus point is that he manages to introduce some simple algorithms and data structures - which surely must form a part of a course at this level but are in any case crucial to gaining an understanding of how you can make computers work for you. There are plenty of both question-and-answer and programming exercises for every chapter, ranging in difficulty from the confidence-building to the challenging, e.g. write a learning tic-tac-toe program.
The only real negative I have is that the CD-ROM that comes with the book contains a trial version of Visual J++ rather than the class libraries used in the text, which have to be sourced from the Internet instead. Oh and I think the cover makes the book look naff, which is a shame as the text inside is nicely laid-out and easy on the eye. Apart from that, very much recommended.