The material covered in this chapter is also discussed in Chapter 3 of my book Understanding Object-oriented Programming with Java, published by Addison-Wesley in 1998. This chapter is reprinted here in both postscript and pdf format.