Diferença chave: Interface ou protocolo é uma maneira comum que permite que objetos não relacionados se comuniquem uns com os outros. Representa um comportamento acordado que facilita a interação entre os dois objetos. Uma classe abstrata é uma classe de objetos que não podem ser instanciados ou configurados como uma instância de um objeto. Essa classe pode não ter nenhuma implementação ou pode ter uma implementação incompleta.
Java é uma linguagem de programação, que foi influenciada pela linguagem C. Ele deriva muito da sua sintaxe de C e C ++, no entanto, tem menos facilidades de baixo nível do que qualquer um. Java é uma linguagem de programação de uso geral projetada para ter menos dependências de implementação em comparação com os idiomas anteriores. É uma linguagem concorrente, baseada em classes e orientada a objetos.
Java foi desenvolvido por James Gosling na Sun Microsystems e foi lançado em 1995. Foi originalmente lançado como um componente central da plataforma Java da Sun Microsystems. A Sun já re-licenciou a maioria de suas tecnologias Java sob a Licença Pública Geral GNU. Isso significa que toda a tecnologia licenciada sob a GNU General Public License é de código aberto e geralmente está disponível gratuitamente. A Sun Microsystems acabou se fundindo à Oracle Corporation. A partir de 2012, o Java tornou-se uma das linguagens de programação mais populares para uso. Isso é especialmente verdadeiro para aplicativos da Web cliente-servidor. Muitos outros sistemas desenvolveram implementações alternativas das tecnologias da Sun, como o GNU Compiler for Java e o GNU Classpath.
Uma classe abstrata é uma classe de objetos que não podem ser instanciados ou configurados como uma instância de um objeto. Essa classe pode não ter nenhuma implementação ou pode ter uma implementação incompleta. Ele também pode ter métodos abstratos ou propriedades que são compartilhadas por todas as subclasses. Em algumas linguagens de programação, tipos abstratos sem implementação são conhecidos como interfaces. Em Java, um tipo abstrato pode ser criado usando a palavra-chave 'abstract' na definição da classe. O objetivo de ter uma classe abstrata para colocar todos os métodos que não estão implementados na classe abstrata e deixá-la para a subclasse para determinar como implementar essas classes. Se uma classe tiver um único método abstrato, a classe deve ser declarada como uma classe abstrata, embora não seja necessário ter pelo menos um método único para declarar um resumo de classe.
Malliktalksjava.in lista as principais diferenças entre interface e resumo como:
- A classe abstrata tem o construtor, mas a interface não.
- Classes abstratas podem ter implementações para alguns de seus membros (Methods), mas a interface não pode ter implementação para nenhum de seus membros.
- Classes abstratas devem ter subclasses que serão inúteis.
- Interfaces devem ter implementações por outras classes que serão inúteis
- Apenas uma interface pode estender outra interface, mas qualquer classe pode estender uma classe abstrata.
- Todas as variáveis nas interfaces são finais por padrão
- Interfaces fornecem uma forma de herança múltipla. Uma classe pode estender apenas uma outra classe.
- Interfaces são limitadas a métodos públicos e constantes sem implementação. Classes abstratas podem ter uma implementação parcial, partes protegidas, métodos estáticos, etc.
- Uma classe pode implementar várias interfaces. Mas no caso da classe abstrata, uma classe pode estender apenas uma classe abstrata.
- Interfaces são lentas, uma vez que requer uma indireção extra para encontrar o método correspondente na classe real. Classes abstratas são rápidas.
- O modificador de acessibilidade (Público / Privado / interno) é permitido para a classe abstrata. Interface não permite modificador de acessibilidade
- Uma classe abstrata pode conter métodos completos ou incompletos. Interfaces podem conter apenas a assinatura de um método, mas nenhum corpo. Assim, uma classe abstrata pode implementar métodos, mas uma interface não pode implementar métodos.
- Uma classe abstrata pode conter campos, construtores ou destruidores e implementar propriedades. Uma interface não pode conter campos, construtores ou destruidores e tem apenas a assinatura da propriedade, mas não a implementação.
- Vários modificadores de acesso, como abstrato, protegido, interno, público, virtual, etc., são úteis em Classes abstratas, mas não em interfaces.
- Escopo abstrato é até classe derivada.
- O escopo da interface é de qualquer nível de sua cadeia de herança.
As informações para a tabela são cortesia de codeproject.com e mindprod.com
Interface | Classe abstrata | |
Herança múltipla | Uma classe pode herdar várias interfaces. | Uma classe pode herdar apenas uma classe abstrata. |
Implementação Padrão | Uma interface não pode fornecer nenhum código, apenas a assinatura. | Uma classe abstrata pode fornecer código padrão completo e / ou apenas os detalhes que devem ser substituídos. |
Modificadores de Acesso | Uma interface não pode ter modificadores de acesso para subs, funções, propriedades, etc., tudo é assumido como público. | Uma classe abstrata pode conter modificadores de acesso para subs, funções e propriedades. |
Núcleo vs. Periférico | Interfaces são usadas para definir as habilidades periféricas de uma classe. Em outras palavras, tanto Humano quanto Veículo podem herdar de uma interface IMovável. | Uma classe abstrata define a identidade central de uma classe e lá é usada para objetos do mesmo tipo. |
Homogeneidade | Se várias implementações apenas compartilharem assinaturas de métodos, é melhor usar Interfaces. | Se várias implementações forem do mesmo tipo e usarem comportamento ou status comuns, é melhor usar a classe abstrata. |
Rapidez | Requer mais tempo para encontrar o método real nas classes correspondentes. | Rápido |
Adicionando funcionalidade | Se adicionarmos um novo método a uma interface, temos que rastrear todas as implementações da interface e definir a implementação do novo método. | Se adicionarmos um novo método a uma classe abstrata, temos a opção de fornecer implementação padrão e, portanto, todo o código existente pode funcionar corretamente. |
Campos e Constantes | Nenhum campo pode ser definido em interfaces. | Uma classe abstrata pode ter campos e constantes definidos. |
Intensidade | As declarações constantes em uma interface são todas presumidas public static final. | Código compartilhado pode ser adicionado em uma classe abstrata. |
Constantes | Apenas constantes finais estáticas, podem usá-las sem qualificação em classes que implementam a interface. | Ambas as instâncias e constantes estáticas são possíveis. Ambos estático e código de iniciador de instância também são possíveis para calcular as constantes. |
Conveniência de terceiros | Uma implementação de interface pode ser adicionada a qualquer classe de terceiros existente. | Uma classe de terceiros deve ser reescrita para estender somente da classe abstrata. |
é-um vs. -able ou pode-fazer | Interfaces são freqüentemente usadas para descrever as habilidades periféricas de uma classe, não sua identidade central, por exemplo, uma classe Automobile pode implementar a interface Recyclable, que poderia se aplicar a muitos objetos totalmente não relacionados. | Uma classe abstrata define a identidade central de seus descendentes. As interfaces implementadas enumeram as coisas gerais que uma classe pode fazer, não as coisas que uma classe é. Em um contexto Java, os usuários normalmente devem implementar a interface Runnable em vez de estender o Thread, porque eles não estão realmente interessados em fornecer alguma nova funcionalidade Thread, eles normalmente só querem que algum código tenha a capacidade de executar independentemente. Eles querem criar algo que possa ser executado em um thread, não um novo tipo de thread. O semelhante é-um vs. tem-um debate surge quando você decide herdar ou delegar. |
Plugar | O usuário pode gravar um novo módulo de substituição para uma interface que contenha não um código de barras em comum com as implementações existentes. Quando o usuário implementa a interface, eles começam do zero sem nenhuma implementação padrão. O usuário tem que obter ferramentas de outras classes; nada vem com a interface além de algumas constantes. Isso dá ao usuário liberdade para implementar um design interno radicalmente diferente. | O usuário deve usar a classe abstrata como é para a base de código, com toda a sua bagagem de acompanhante, boa ou ruim. O autor da classe abstrata impôs estrutura ao usuário. |
Manutenção | Se o código do cliente fala apenas em termos de uma interface, você pode facilmente alterar a implementação concreta por trás dele, usando um método de fábrica. | Se o código do cliente fala apenas em termos de uma classe abstrata, você pode facilmente alterar a implementação concreta por trás dele, usando um método de fábrica. |