Klasa to jest po prostu klasa, czyli zbiór informacji (pola) oraz zbiór zachowań(metody) jakie klasa(a raczej późniejszy obiekt typu tej klasy) może przyjmować. Klasa abstrakcyjna natomiast to taka klasa, z której nie można stworzyć obiektu, czyli 'fizycznego' bytu.
Interfejs natomiast to można rzec wyspecjalizowany zbiór zachowań (metod) do zaimplementowania dla danej klasy. Czyli tworzysz np klasę Człowiek i implementujesz w nim interfejsy (mówienie, poruszanie itd.). Teraz wyobraź sobie, że pracujesz nad funkcjonalnością poruszania się obiektów na mapie 2D. Nie będziesz wtedy inicjalizował obiektów klasy Człowiek, bo np Zwierzę czy tam Samochód też mogą się poruszać. Wtedy zainicjalizujesz obiekt typu danego interfejsu, a więc :
Poruszanie obiekt; - i do tego możesz przypisywać wszystkie obiekty klas, które mają zaimplementowany ten interfejs (implementujesz go w Człowiek, Zwierzę, Samochód) ponieważ te klasy mają w sobie definicję tego interfejsu. Chodzi o to, że działasz w tym wypadku na pewnym wyspecjalizowanym zagadnieniu danego obiektu (Poruszanie) nie mając dostępu do innych jego zachowań(innych metod nie dotyczących poruszania).
A co do różnicy między klasą abstrakcyjną, a interfejsem, to dana klasa może dziedziczyć tylko po jednej klasie, a może implementować wiele interfejsów. Druga rzecz, to w klasie abstrakcyjnej można definiować ciała metod, a w interfejsach występują tylko sygnatury metod (chociaż od Javy 8 są tzw. default method, co trochę rozmywa tutaj sprawę)