Myślę, że łatwo to zrozumiesz, jeżeli przyjrzysz się bliżej kolekcjom w javie.
Praktyczny przykład:
Mamy interfejs List<E>, który udostępnia kilka funkcji, miedzy innymi np add(E object);
Jak tworzysz listę to masz do wyboru np ArrayList albo LinkedList które implementują interfejs List<E>. Każda z nich może działać inaczej, w inny sposób przechowywać elementy, ale każda z nich udostępnia funkcję add(E object) dodające elementy.
List mowi co może robic, ArrayList lub LinkedList mówią jak to zrobić.
List<Integer> list = new ArrayList();
List<Integer> list2 = new LinkedList();
list.add(5); // dodanie 5 do listy, która jest ArrayListą
list2.add(6); // dodanie 6 do listy, która jest LinkedListą
Interfejsy dają tą elastyczność, że jakbyś chciał to możesz napisać własną implementację listy (czyli napisac co ma sie dziac przy funckji add() iid) i jej używać za pomocą interfejsu List:
List<Integer> myTheBestList = new MySuperHiperUltraBetterList();
myTheBestList.add(333333); // dodanie 333333 do listy, która jest MySuperHiperUltraBetterListą