Olá. Sou estudante de A.D.S. e estou fazendo uma pesquisa sobre Interfaces e Heranças.
Por quê, em java, os programadores privilegiam (ou devem privilegiar) o uso de interfaces em seus projetos ao invés do uso de Herança com classes? À quais características de Interface se devem essa preferência?
Eu costumo dizer que: herança é um tipo de relação que estreita as possibilidades e implementação (interface) é um tipo de relação que expande as possibilidades.
Ah, não é apenas no java que isso é (ou deveria ser) priorizado. Basicamente, é em tudo o que você implementa o paradiga da orientação a objetos. A peculiaridade de não possuir suporte à herança múltipla, talvez, ajude para que este mito mantenha-se no java.
Bom, a herança visa evitar que você tenha duas ou mais classes com duplicidade de atributos e/ou métodos. Está ligada ao conceito de generalização da OO, apenas. Eventualmente, você pode trabalhar com polimorfismo.
Já a interface visa, primeiro, estabelecer um contrato entre o que você implementou e uma terceira parte, que pode ou não ser desenvolvido por ti, pelo time no qual você trabalha ou pela empresa onde isso ocorre.
Esse contrato, a interface, possui a declaração de métodos, sem corpo (ok, do java 8 para frente você já tem coisas como o default method). Todos os atributos inseridos numa interface será, automaticamente, static final, ou seja, são constantes (podendo ser, apenas, default ou public).
O objetivo de implementar uma interface está ligado a dois conceitos da OO: o primeiro (e mais óbvio): polimorfismo. Uma vez que a classe concreta que implementa uma interface é obrigada a dar corpo a cada método presente neste contrato, é a ideia fundamental de existir desses caras.
O segundo caso está ligado a encapsulamento em nível de classe. Com o uso de uma interface, você só expõe o que realmente precisa ser exposto.
Em geral, prefira composição/agtregação e implementação a herança.
Estes conceitos são muito bem abordados no livro Use a cabeça - Padrões de Projeto(Head First - Design Paterns). A manutenção e reuso de componentes se faz via implementação(interface), enquanto a tentativa baseada em heranção tende a engessar o código.
Alguém discorda? Alguém pode acrescentar mais alguma coisa ao debate?
E em muitos casos não se deve usar nem um nem outro. Infelizmente vejo muito código usando por exemplo Interface sem necessidade, por consequencia uma codificação burocrática.
Vou te dar a chave dessa pergunta: Busque essa informações em livros de POO e no minimo 2 a 3 que ai você possa montar uma resposta com implementações e um conteúdo bem escrito.
Não vai adiantar pegar trechos de idéias, vai te confundir mais. E quem sabe você mesmo responda a sua pergunta aqui deixando um conteúdo bem elaborado.