Meu, interfaces surgiram no Java pra atender a uma necessidade na programação OO que em C++ é implementada de um jeito muito feio: herança múltipla.
A idéia é que vc tem uma classe Automóvel, abstrata ou não, não importa. Ela tem métodos de acesso aos dados típicos de um automóvel, por exemplo, quantos litros de gasolina tem no tanque, ou se ele está ligado.
Aí vc quer fazer herança pra usar polimorfismo (alguém tem um dicionário? :lol:). Isto é, vc quer fazer as classes Carro e Moto sendo extensões de Automovel e aproveitando alguns métodos e reimplementando só o necessário. Polimorfismo significa que vc quer poder declarar uma variável da classe Automóvel no seu programa e atribuir um Carro ou uma Moto de forma que ele consiga chamar os métodos certos pras variáveis certas.
Agora vamos imaginar que no seu programa vc tb tem uma classe Patrimônio, abstrata ou não, que tem métodos como valorDeVenda(). Com certeza, se vc comprou um carro, ele é patrimônio seu, e vc quer modelar isso no seu programa. E agora, como a classe carro pode ser ao mesmo tempo Automovel e Patrimonio?
Em C++, eles resolveram do ponto de vista do compilador: pode ser as duas. O compilador se vira, e vc tem meios de fazer a coisa funcionar. Mas e em Java?
Em Java vc só pode ter uma classe pai, isto é, vc só pode extender 1 classe. Mas vc pode implementar várias interfaces. Assim é que eles permitem herança múltipla. Em vez de uma classe abstrata, vc declara uma interface Automóvel e uma interface Patrimônio. Sua classe Carro, concreta, pode implementar as duas interfaces e “ser vista” como Automóvel pelo código que mexe com automóveis e como Patrimonio pelo código que lida com seu imposto de renda.
Outras explicações mais filosóficas são uma tentativa de te enrolar. Ninguém nesse meio faz nada que não seja absolutamente necessário. Só nós que tamos aprendendo ainda… : )
Aliás, pra quebrar a cabeça: o que acontece quando duas interfaces diferentes têm um método com a mesma assinatura? E se mudar só o valor de retorno? Exempllo:
Interface Face1 {
public int getValue();
}
// ... no outro arquivo, como manda o figurino, né?
Interface Face2 {
public String getValue();
}
Quem manda na hora de escolher qual método vale?
abração!!