In most cases, objects will contain data members that are references to other objects. For example, we might have a Student class and an instance of Student has a reference to an instance of Name.
In this first example, the Driver must be aware of how the Student object stores the Name. It creates a Name object and passes it to the Student constructor. When the Driver wishes to change the last name stored in the Name object, it first retrieves the object from the Student object and then invokes the appropriate method.
In this second example, the Driver does not have to be aware of how the Student stores the Name. In many ways, this is preferable since Student can change the way it stores the name and the API it exposes does not need to change. No other code that uses Student's API must change. Notice that the Name class remains the same.