difference between encapsulation and abstraction in java