I addressed the material in this chapter in Chapter 10 of my book Understanding Object-Oriented Programming with Java. In that work I also consider dynamic composition (changing your parent at run-time), inner classes, and anonymous classes. A copy of this chapter is available in postscript or in pdf. (These files were generated from the original Latex, and look slightly different from the book versions).
Were I to reexamine this material today I would probably also include sections on generics, or templates, in addition to inner classes and the other topics address above.
I also examine this material from a slightly different perspective in my chapter on sets (Chapter 7) in Multiparadigm Programming in Leda. There I consider not only inheritance and composition, but contrast a data-centeric view of sets with the representation of sets as a charactersitic function. Students interested in programming languages should examine this chapter. It is reprinted here both in postscript and in pdf.