I would say that the reason is to have a common API for all objects in java to supports basic functionality like
- synchronization –
wait,notify,notifyAll - garbage collection –
finalize - collection support –
hashCode,equals - object cloning –
clone
And every object
- has a class it belongs to –
getClass - can represent itself as a string, because we are
humans and can read strings –toString