I think there is little bit confusion going on for lazy initialization. Though few explanations a good but missing some points.
Basically lazy initialization works like that.
1. If lazy = "true"
Any associated collection will not be loaded first time, for an example if Department is associated with Employee then on first loading of the Department entity, associated Employee entities will not be loaded.
Note: it will not be loaded even if you say
List list = department.getEmployees();
So in that case list will be always empty. Now once you do any operation on the list then only Employee entities will be loaded from DB, like list.size() etc.
How hibernate intercept the method calls on collection - They have their own implementation of List, Set etc.
2. Also note that you can not call department.getEmployees() and do operation on returned collection once session is closed and transaction is committed. So the Rule is if lazy="true" you can load associated collections lazily if and only if session is open.
Hope fully that will give you enough information.