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