It allows you to enforce constraints on an object's state.
It provides a simpler client interface. Client programmers
don't need to know everything that's in the class, only the public
parts.
It separates interface from implementation, allowing them to
vary independently. For instance consider making the
licensePlate field of Car an instance of a new
LicensePlate class instead of a String.