There are two fundamentally distinct ways to learn about OOP. The first is to study a computing language that either supports OOP (such as C++) or requires it (Smalltalk). The second is to study OOP in and of itself and then later learn a computing language in which you can apply the understanding that you have gained.
This book attempts to find a third way by setting out to teach you about the general thought processes that lead to OO code while using snippets of code written in Java to communicate the ideas. I think this is fundamentally flawed. If you are to acquire solid OO thought processes then this must be done out of the context of a computing language. The fact that the author finds this a step to far suggests to me that his grasp of OO is still a little less than confident.
There is a considerable amount of merit in this book, but, in my opinion, it is not yet ready for publication.
What have such things as deep versus shallow copies to do with the fundamentals of OO? It is things like that which lead me to think that the author is reasonably familiar with OOP in C++ and Java but has not succeeded in abstracting his understanding from the languages he is using.
In simple terms there is too much language implementation detail for a book with this title. This is not a bad book, just one that does not achieve what it claims.