Definem um conjunto de funcionalidades que podem ser aplicadas a diversas classes
Existem para solucionar o problema de herança múltipla
Por padrão seus métodos são public e abstract
Só possuem métodos concretos se forem default, ou private, ou static. Isso se deve ao fato de esses métodos não causarem o conflito de herança múltipla (com exceção do default, que possuí outra solução)
Se uma classe implementar múltiplas interfaces e houver uma duplicação de métodos default com a mesma assinatura, o compilador irá tratar o método como abstract e exigirá uma implementação
A palavra reservada default não é um modificador de acesso; ela apenas diz que o método da interface possuí corpo
Podem conter constantes, mas não variáveis
Se uma classe X implementa a interface Y
Uma referência de X pode sofrer um cast para Y
Uma referência de Y pode sofrer um cast para X
Utilizadas no Composition Pattern
Uma interface que implementa apenas uma operação abstrata é chamada functional interface
Podem ser utilizadas como um tipo de variável, mas não ser instanciar; similar a uma classe abstract
Interfaces vazias podem ser utilizadas como type-marker ou tag-interface. Como interfaces são tipos, essas são utilizadas para permitir uma classe de ser usada em algo (em uma comparação instanceof)