Цель инкапсуляции - скрыть детали реализации:
Очень надуманный пример:
public class Person {
private int age;
public boolean canBuyBeer() {
return age >= 21;
}
}
Вы можете позже изменить это на:
public class Person {
private int age;
private boolean isInUSA
public boolean canBuyBeer() {
if( isInUSA )
return age >= 21;
else
return age >= 18;
}
}
Правила, касающиеся возраста и происхождения, могут измениться, но звонящий не должен знать.
Интерфейсы могут использоваться для абстрагирования различных типов. Учтите это:
public interface Beverage {
public boolean containsAlchohol;
}
public class Soda implements Beverage {
public boolean containsAlchohol {
return false;
}
}
public class Beer implements Beverage {
public boolean containsAlchohol {
return true;
}
}
Вы можете обновить Person как:
public class Person {
private int age;
private boolean isInUSA
public boolean canBuyBeverage(Beverage b) {
if( b.containsAlchohol() ) {
if( isInUSA )
return age >= 21;
else
return age >= 18;
}
else {
return true;
}
}
}
Таким образом, Человек заключает в себе логику, если когда Человек может купить определенный тип напитка. Интерфейс напитка абстрагирует логику, связанную с напитком.
Можно привести лучшие примеры, но это общая идея.