Parti dal presupposto che sia interfacce che classi astratte, non nascono per essere istanziate, ma bensì per rappresentare astrattamente il tipo base di una classe(per le classi astratte) e comportamenti comuni(interfacce).
Dal punto di vista specifico, per definire una classe astratta, basta che al suo interno hai un metodo dichiarato abstract, per le interfacce, di default, tutti i metodi sono dichiarati abstract. Inoltre in una interfaccia non vai assolutamente ad implementare i metodi, ma dichiari solo le firme dei metodi, e puoi andare a definire solo costanti (dichiarate "static final").
Una nota riguardo alle classi astratte:
In una classe astratta, potresti avere dei metodi non dichiarati abstract e fornire anche una implementazione.
In definitiva, spesso, le classi astratte le usi per astrarre il tipo base di una classe,fornendo un contratto verticale... mentre con una interfaccia vai ad astrarre i comportamenti che risultano essere in comune tra più classi, fornendo un contratto orizzontale.. tra gli oggetti che andranno ad implementare l'interfaccia.
N.b: Questo in linea di massima, ci sono ancora tante cose da spiegare... ma basta che leggi un libro a riguardo.