advantages of abstraction in java