Interfaces e classes abstratas são usadas para herança em Java. Interfaces permitem herança múltipla enquanto classes abstratas só permitem herança única. Interfaces definem métodos públicos e abstratos que precisam ser implementados, ao passo que classes abstratas podem ter métodos e variáveis concretas além de abstratos.