Em uma de minhas entrevistas, fui solicitado a explicar a diferença entre uma classe Interface e uma aula Abstrata .
Aqui está a minha resposta:
Os métodos de uma interface Java são implicitamente abstratos e não podem ter implementações. Uma classe abstrata Java pode ter métodos de instância que implementam um comportamento padrão.
As variáveis declaradas em uma interface Java são, por padrão, finais. Uma classe abstrata pode conter variáveis não finais.
Membros de uma interface Java são públicos por padrão. Uma classe abstrata Java pode ter os sabores usuais dos membros da classe, como privado, protegido etc.
Uma interface Java deve ser implementada usando a palavra-chave "implementa"; Uma classe abstrata de Java deve ser estendida usando a palavra-chave “extends”.
Uma interface pode estender apenas outra interface Java, uma classe abstrata pode estender outra classe Java e implementar várias interfaces Java.
Uma classe Java pode implementar várias interfaces, mas pode estender apenas uma classe abstrata.
No entanto, o entrevistador não ficou satisfeito e disse-me que essa descrição representava " conhecimento livreiro ".
Ele me pediu uma resposta mais prática, explicando quando eu escolheria uma aula abstrata em vez de uma interface, usando exemplos práticos .
Onde foi que eu errei?
fonte
Respostas:
Vou dar um exemplo primeiro:
Suponha que você tenha 3 bancos de dados em seu aplicativo. Cada implementação desse banco de dados precisa definir os 2 métodos acima:
Mas e se
encryptPassword()
não for dependente do banco de dados e for o mesmo para cada classe? Então, o exposto acima não seria uma boa abordagem.Em vez disso, considere esta abordagem:
Agora, em cada classe filho, precisamos implementar apenas um método - o método que depende do banco de dados.
fonte
Nada é perfeito neste mundo. Eles podem estar esperando uma abordagem mais prática.
Mas após a sua explicação, você pode adicionar essas linhas com uma abordagem ligeiramente diferente.
Interfaces são regras (regras porque você deve dar uma implementação a elas que não pode ignorar ou evitar, para que sejam impostas como regras), que funciona como um documento de entendimento comum entre várias equipes no desenvolvimento de software.
As interfaces dão a idéia do que deve ser feito, mas não como será feito. Portanto, a implementação depende completamente do desenvolvedor, seguindo as regras fornecidas (significa assinatura de métodos).
As classes abstratas podem conter declarações abstratas, implementações concretas ou ambas.
Declarações abstratas são como regras a serem seguidas e implementações concretas são como diretrizes (você pode usá-lo como está ou pode ignorá-lo, substituindo-o e fornecendo sua própria implementação).
Além disso, quais métodos com a mesma assinatura podem alterar o comportamento em diferentes contextos são fornecidos como declarações de interface e como regras a serem implementadas em diferentes contextos.
Edit: Java 8 facilita a definição de métodos padrão e estáticos na interface.
Agora, quando uma classe implementará SomeInterface, não é obrigatório fornecer implementação para métodos padrão de interface.
Se tivermos outra interface com os seguintes métodos:
Java não permite estender várias classes porque resulta no "Problema de Diamante", em que o compilador não pode decidir qual método de superclasse usar. Com os métodos padrão, o problema do diamante também surgirá para as interfaces. Porque se uma classe está implementando ambos
e não implementa o método padrão comum, o compilador não pode decidir qual escolher. Para evitar esse problema, no java 8 é obrigatório implementar métodos padrão comuns de diferentes interfaces. Se alguma classe estiver implementando as duas interfaces acima, ela deverá fornecer implementação para o método defaultMethod (), caso contrário, o compilador lançará um erro de tempo de compilação.
fonte
Você fez um bom resumo das diferenças práticas no uso e implementação, mas não disse nada sobre a diferença de significado.
Uma interface é uma descrição do comportamento que uma classe de implementação terá. A classe de implementação garante que terá esses métodos que podem ser usados nela. É basicamente um contrato ou promessa que a classe tem que fazer.
Uma classe abstrata é uma base para diferentes subclasses que compartilham comportamentos que não precisam ser criados repetidamente. As subclasses devem concluir o comportamento e ter a opção de substituir o comportamento predefinido (desde que não seja definido como
final
ouprivate
).Você encontrará bons exemplos no
java.util
pacote, que inclui interfaces comoList
e classes abstratas como asAbstractList
que já implementam a interface. A documentação oficial descreve oAbstractList
seguinte:fonte
abstract
palavra - chave, ou seja, quando um compilador vê isso, eles sabem, as seguintes informações estão incompletas e precisam ser implementadas . As interfaces são sempre incompletas, mas as classes abstratas são abstratas porque precisavam terincomplete (abstract)
métodos.Uma interface consiste em variáveis singleton (final estático público) e métodos abstratos públicos. Normalmente, preferimos usar uma interface em tempo real quando sabemos o que fazer, mas não sabemos como fazê-lo .
Este conceito pode ser melhor entendido por exemplo:
Considere uma classe de pagamento. O pagamento pode ser feito de várias maneiras, como PayPal, cartão de crédito, etc. Portanto, normalmente aceitamos Payment como nossa interface, que contém um
makePayment()
método, e CreditCard e PayPal são as duas classes de implementação.No exemplo acima, CreditCard e PayPal são duas classes / estratégias de implementação. Uma interface também nos permite o conceito de herança múltipla em Java que não pode ser realizada por uma classe abstrata.
Escolhemos uma classe abstrata quando existem alguns recursos para os quais sabemos o que fazer e outros que sabemos executar .
Considere o seguinte exemplo:
Se adicionarmos métodos (concreto / abstrato) no futuro a uma determinada classe abstrata, a classe de implementação não precisará alterar seu código. No entanto, se adicionarmos métodos em uma interface no futuro, devemos adicionar implementações a todas as classes que implementaram essa interface, caso contrário, ocorrerão erros de tempo de compilação.
Existem outras diferenças, mas essas são as principais que podem ter sido o que o entrevistador esperava. Espero que isso tenha sido útil.
fonte
interface
eabstract class
.Diferença entre classe e interface Abstact
Métodos padrão da interface em Java 8
Método estático da interface Java
Interfaces Funcionais Java
Classes abstratas versus interfaces em Java 8
Diferença conceitual:
As classes abstratas são válidas para implementações esqueléticas (isto é, parciais) de interfaces, mas não devem existir sem uma interface correspondente.
Portanto, quando as classes abstratas são efetivamente reduzidas a implementações esqueléticas de interfaces de baixa visibilidade, os métodos padrão também podem tirar isso? Decididamente: Não! A implementação de interfaces quase sempre requer algumas ou todas as ferramentas de criação de classe que faltam nos métodos padrão. E se alguma interface não funcionar, é claramente um caso especial, que não deve desviar você.
Métodos padrão da interface em Java 8
O Java 8 apresenta o novo recurso " Método Padrão " ou (métodos Defender), que permite ao desenvolvedor adicionar novos métodos às Interfaces sem interromper a implementação existente dessa Interface. Ele fornece flexibilidade para permitir que a Interface defina a implementação que será usada como padrão na situação em que uma Classe concreta falha ao fornecer uma implementação para esse método.
Vamos considerar um pequeno exemplo para entender como funciona:
A classe a seguir será compilada com êxito no Java JDK 8,
Se você criar uma instância de OldInterfaceImpl:
Método padrão:
Os métodos padrão podem ser fornecidos a uma interface sem afetar as classes de implementação, pois incluem uma implementação. Se cada método adicionado em uma Interface definida com implementação, nenhuma Classe de implementação é afetada. Uma classe de implementação pode substituir a implementação padrão fornecida pela interface.
Quando estendemos uma interface que contém um método padrão, podemos executar os seguintes,
Erro de compilação do método ForEach resolvido usando o Método Padrão
Para Java 8, as coleções JDK foram estendidas e o método forEach é incluído em toda a coleção (que funciona em conjunto com lambdas). Da maneira convencional, o código se parece abaixo,
Como esse resultado, cada classe de implementação com erros de compilação, portanto, foi adicionado um método padrão com uma implementação necessária para que a implementação existente não fosse alterada.
A interface iterável com o método padrão está abaixo,
O mesmo mecanismo foi usado para adicionar fluxo na interface JDK sem interromper as classes de implementação.
Método padrão e vários problemas de ambiguidade de herança
Como a classe java pode implementar várias interfaces e cada interface pode definir o método padrão com a mesma assinatura de método, portanto, os métodos herdados podem entrar em conflito entre si.
Considere o exemplo abaixo,
O código acima falhará ao compilar com o seguinte erro,
Para corrigir essa classe, precisamos fornecer a implementação do método padrão:
Além disso, se quisermos chamar a implementação padrão fornecida por qualquer super interface, em vez de nossa própria implementação, podemos fazer o seguinte:
Podemos escolher qualquer implementação padrão ou ambas como parte de nosso novo método.
Pontos importantes sobre os métodos padrão da interface java:
Link do recurso:
Método estático da interface Java
Método estático da interface Java, exemplo de código, método estático versus método padrão
O método estático da interface Java é semelhante ao método padrão, exceto que não podemos substituí-los nas classes de implementação. Esse recurso nos ajuda a evitar resultados indesejados, caso a implementação seja ruim nas classes de implementação. Vamos examinar isso com um exemplo simples.
Agora vamos ver uma classe de implementação que está tendo o método isNull () com implementação ruim.
Observe que isNull (String str) é um método de classe simples, não substitui o método da interface. Por exemplo, se adicionarmos a anotação @Override ao método isNull (), isso resultará em erro do compilador.
Agora, quando executaremos o aplicativo, obtemos a seguinte saída.
Se fizermos o método da interface de estático para o padrão, obteremos a seguinte saída.
O método estático da interface Java é visível apenas para os métodos de interface. Se removermos o método isNull () da classe MyDataImpl, não poderemos usá-lo para o objeto MyDataImpl. No entanto, como outros métodos estáticos, podemos usar métodos estáticos de interface usando o nome da classe. Por exemplo, uma declaração válida será:
Pontos importantes sobre o método estático da interface java:
Interfaces Funcionais Java
Antes de concluir o post, gostaria de fornecer uma breve introdução às interfaces funcionais. Uma interface com exatamente um método abstrato é conhecida como Interface Funcional.
Uma nova anotação
@FunctionalInterface
foi introduzida para marcar uma interface como Interface Funcional.@FunctionalInterface
A anotação é um recurso para evitar a adição acidental de métodos abstratos nas interfaces funcionais. É opcional, mas é uma boa prática usá-lo.As interfaces funcionais são muito aguardadas e muito procuradas pelo Java 8, pois nos permite usar expressões lambda para instancia-las. Um novo pacote java.util.function com várias interfaces funcionais é adicionado para fornecer tipos de destino para expressões lambda e referências de método. Examinaremos interfaces funcionais e expressões lambda nas próximas postagens.
Local do Recurso:
fonte
Todas as suas instruções são válidas, exceto a sua primeira (após o lançamento do Java 8):
Na página de documentação :
Métodos padrão:
Uma interface pode ter métodos padrão , mas são diferentes dos métodos abstratos nas classes abstratas.
Ao estender uma interface que contém um método padrão, você pode fazer o seguinte:
abstract
.Métodos estáticos:
Além dos métodos padrão, você pode definir métodos estáticos nas interfaces. (Um método estático é um método associado à classe em que está definido, e não a qualquer objeto. Cada instância da classe compartilha seus métodos estáticos.)
Isso facilita a organização de métodos auxiliares em suas bibliotecas;
Código de exemplo da página de documentação sobre
interface
terstatic
edefault
métodos.Use as diretrizes abaixo para escolher se deseja usar uma interface ou classe abstrata.
Interface:
Classe abstrata:
Compartilhe código entre várias classes estreitamente relacionadas. Estabelece é uma relação.
Compartilhar estado comum entre classes relacionadas (o estado pode ser modificado em classes concretas)
Mensagens relacionadas:
Interface versus classe abstrata (OO geral)
Implementos vs extensões: quando usar? Qual é a diferença?
Analisando esses exemplos, você pode entender que
As classes não relacionadas podem ter recursos por meio da interface, mas as classes relacionadas alteram o comportamento por meio da extensão das classes base.
fonte
stateless
interface é um sucesso. A interface não pode ter nenhum estado (a interface pode ter constantes, mas são finais / estáticas, portanto, imutáveis).Sua explicação parece decente, mas pode parecer que você estava lendo tudo de um livro? : - /
O que mais me incomoda é: quão sólido foi o seu exemplo? Você se preocupou em incluir quase todas as diferenças entre abstrato e interfaces?
Pessoalmente, eu sugiro este link: http://mindprod.com/jgloss/interfacevsabstract.html#TABLE
para uma lista exaustiva de diferenças ..
Espero que ajude você e todos os outros leitores em suas futuras entrevistas
fonte
Muitos desenvolvedores juniores cometem o erro de pensar em interfaces, classes abstratas e concretas como pequenas variações da mesma coisa e escolhem uma delas puramente por motivos técnicos: Preciso de herança múltipla? Preciso de algum lugar para colocar métodos comuns? Preciso me preocupar com algo que não seja apenas uma aula concreta? Isso está errado, e oculto nessas perguntas está o principal problema: "eu" . Quando você escreve um código para si mesmo, raramente pensa em outros desenvolvedores atuais ou futuros trabalhando no seu código ou com ele.
As interfaces e as classes abstratas, embora aparentemente semelhantes do ponto de vista técnico, têm significados e propósitos completamente diferentes.
Sumário
Uma interface define um contrato que alguma implementação cumprirá para você .
Uma classe abstrata fornece um comportamento padrão que sua implementação pode reutilizar.
Esses dois pontos acima são o que estou procurando ao entrevistar e são um resumo compacto o suficiente. Continue lendo para mais detalhes.
Resumo alternativo
Por exemplo
Em outras palavras: uma classe concreta faz o trabalho real, de uma maneira muito específica. Por exemplo, um
ArrayList
usa uma área contígua da memória para armazenar uma lista de objetos de maneira compacta, que oferece acesso aleatório rápido, iteração e alterações no local, mas é terrível em inserções, exclusões e, ocasionalmente, inclusões; enquanto isso, umLinkedList
usa nós com vínculo duplo para armazenar uma lista de objetos, que oferecem iteração rápida, alterações no local e inserção / exclusão / adição, mas são terríveis no acesso aleatório. Esses dois tipos de lista são otimizados para diferentes casos de uso, e importa muito como você os usará. Ao tentar extrair o desempenho de uma lista com a qual você está interagindo intensamente, e ao escolher o tipo de lista é sua, você deve escolher com cuidado qual deles está instanciando.Por outro lado, os usuários de alto nível de uma lista não se importam com como ela é realmente implementada e devem ser isolados desses detalhes. Vamos imaginar que o Java não expôs a
List
interface, mas só tinha umaList
classe concreta que é realmente o queLinkedList
é agora. Todos os desenvolvedores Java teriam adaptado seu código para atender aos detalhes da implementação: evite o acesso aleatório, adicione um cache para acelerar o acesso ou apenas reimplementeArrayList
por conta própria, embora seja incompatível com todos os outros códigos que realmente funcionamList
apenas. Isso seria terrível ... Mas agora imagine que os mestres Java realmente percebam que uma lista vinculada é terrível para a maioria dos casos de uso reais e decidiram mudar para uma lista de matrizes apenas paraList
classe disponível. Isso afetaria o desempenho de todos os programas Java do mundo e as pessoas não ficariam felizes com isso. E o principal culpado é que os detalhes da implementação estavam disponíveis, e os desenvolvedores assumiram que esses detalhes são um contrato permanente em que podem confiar. É por isso que é importante ocultar os detalhes da implementação e definir apenas um contrato abstrato. Esse é o objetivo de uma interface: defina que tipo de entrada um método aceita e que tipo de saída é esperado, sem expor todas as tripas que tentariam os programadores a ajustar seu código para ajustar os detalhes internos que podem mudar com qualquer atualização futura .Uma classe abstrata está no meio entre interfaces e classes concretas. Ele deve ajudar as implementações a compartilhar código comum ou chato. Por exemplo,
AbstractCollection
fornece implementações básicas para oisEmpty
tamanho 0,contains
como iterar e comparar,addAll
conforme repetidoadd
e assim por diante. Isso permite que as implementações se concentrem nas partes cruciais que diferem entre elas: como realmente armazenar e recuperar dados.Outra perspectiva: APIs versus SPIs
Interfaces são gateways de baixa coesão entre diferentes partes do código. Eles permitem que as bibliotecas existam e evoluam sem interromper todos os usuários da biblioteca quando algo muda internamente. Chama-se Interface de Programação de Aplicativos , não Classes de Programação de Aplicativos. Em uma escala menor, eles também permitem que vários desenvolvedores colaborem com sucesso em projetos de grande escala, separando diferentes módulos por meio de interfaces bem documentadas.
As classes abstratas são ajudantes de alta coesão a serem usadas na implementação de uma interface, assumindo algum nível de detalhes de implementação. Como alternativa, classes abstratas são usadas para definir SPIs, interfaces de provedor de serviços.
A diferença entre uma API e uma SPI é sutil, mas importante: para uma API, o foco está em quem a usa e, para uma SPI, está focada em quem a implementa .
É fácil adicionar métodos a uma API, todos os usuários existentes da API ainda serão compilados. É difícil adicionar métodos a um SPI, pois todo provedor de serviços (implementação concreta) precisará implementar os novos métodos. Se forem usadas interfaces para definir uma SPI, o provedor precisará liberar uma nova versão sempre que o contrato da SPI for alterado. Se classes abstratas forem usadas, novos métodos podem ser definidos em termos de métodos abstratos existentes ou como
throw not implemented exception
stubs vazios , o que permitirá pelo menos que uma versão mais antiga de uma implementação de serviço ainda seja compilada e executada.Uma observação sobre Java 8 e métodos padrão
Embora o Java 8 tenha introduzido métodos padrão para interfaces, o que torna a linha entre interfaces e classes abstratas ainda mais embaçada, isso não foi para que as implementações possam reutilizar o código, mas para facilitar a alteração de interfaces que servem tanto como API quanto como SPI (ou são usados incorretamente para definir SPIs em vez de classes abstratas).
"Conhecimento do livro"
Os detalhes técnicos fornecidos na resposta do OP são considerados "conhecimento do livro", porque essa é geralmente a abordagem usada na escola e na maioria dos livros de tecnologia sobre um idioma: o que é importante, não como usá-lo na prática, especialmente em aplicações de grande escala .
Aqui está uma analogia: supunha que a pergunta era:
A resposta técnica soa como:
Isso tudo é verdade, mas perde completamente os pontos de que são duas coisas completamente diferentes, e ambas podem ser usadas ao mesmo tempo para propósitos diferentes, e o aspecto "fazê-lo" não é a coisa mais importante em nenhuma das duas opções. . A resposta não tem perspectiva, mostra uma maneira imatura de pensar, enquanto apresenta corretamente "fatos" verdadeiros.
fonte
Que tal pensar da seguinte maneira:
Então, quando você tem uma classe abstrata Mammals, uma subclasse Human e uma interface Driving, você pode dizer
Minha sugestão é que a frase de conhecimento do livro indique que ele queria ouvir a diferença semântica entre os dois (como outros aqui já sugeridos).
fonte
Uma interface é um "contrato" em que a classe que implementa o contrato promete implementar os métodos. Um exemplo em que eu tive que escrever uma interface em vez de uma classe foi quando eu estava atualizando um jogo de 2D para 3D. Eu tive que criar uma interface para compartilhar classes entre as versões 2D e 3D do jogo.
Então, eu posso implementar os métodos com base no ambiente, enquanto ainda consigo chamá-los de um objeto que não sabe qual versão do jogo está carregando.
public class Adventure extends JFrame implements Playable
public class Dungeon3D extends SimpleApplication implements Playable
public class Main extends SimpleApplication implements AnimEventListener, ActionListener, Playable
Normalmente, no mundo dos jogos, o mundo pode ser uma classe abstrata que executa métodos no jogo:
fonte
As classes abstratas não são pura abstração, pois sua coleção de métodos concretos (métodos implementados) e não implementados. Mas as interfaces são pura abstração, pois existem apenas métodos não implementados, não métodos concretos.
Por que aulas abstratas?
Por que interfaces?
fonte
Uma interface é como um conjunto de genes documentados publicamente para ter algum tipo de efeito: um teste de DNA me dirá se eu os tenho - e se eu tiver, posso publicamente divulgar que sou um portador "e parte do meu comportamento ou estado estará em conformidade com eles. (Mas é claro, eu posso ter muitos outros genes que fornecem características fora desse escopo.)
Uma classe abstrata é como o ancestral morto de uma espécie do mesmo sexo (*): ela não pode ser trazida à vida, mas um descendente vivo (isto é, não abstrato ) herda todos os seus genes.
(*) Para esticar essa metáfora, digamos que todos os membros da espécie vivem na mesma idade. Isso significa que todos os ancestrais de um ancestral morto também devem estar mortos - e da mesma forma, todos os descendentes de um ancestral vivo devem estar vivos.
fonte
Eu faço entrevistas para o trabalho e eu ficaria desfavorável em sua resposta também (desculpe, mas sou muito honesto). Parece que você leu sobre a diferença e revisou uma resposta, mas talvez você nunca a tenha usado na prática.
Uma boa explicação de por que você usaria cada um pode ser muito melhor do que ter uma explicação precisa da diferença. Os empregadores ultimatley querem que os programadores façam coisas que não os conhecem e que podem ser difíceis de demonstrar em uma entrevista. A resposta que você deu seria boa se se candidatasse a um trabalho técnico ou baseado em documentação, mas não na função de desenvolvedor.
Boa sorte com entrevistas no futuro.
Além disso, minha resposta a essa pergunta é mais sobre a técnica da entrevista, em vez do material técnico que você forneceu. Talvez considere ler sobre isso. https://workplace.stackexchange.com/ pode ser um excelente lugar para esse tipo de coisa.
fonte
Você escolhe Interface em Java para evitar o problema do diamante na herança múltipla .
Se você deseja que todos os seus métodos sejam implementados pelo seu cliente, opte pela interface. Isso significa que você projeta o aplicativo inteiro em resumo.
Você escolhe a classe abstrata se já sabe o que está em comum. Por exemplo, pegue uma classe abstrata
Car
. No nível superior, você implementa os métodos comuns de carro, comocalculateRPM()
. É um método comum e você permite que o cliente implemente seu próprio comportamento, comocalculateMaxSpeed()
etc. Provavelmente, você explicaria dando alguns exemplos em tempo real que encontrou no seu trabalho do dia a dia.fonte
Uma interface é puramente abstrata. não temos nenhum código de implementação na interface.
A classe Abstract contém os métodos e sua implementação.
Clique aqui para assistir ao tutorial sobre interfaces e classes abstratas
fonte
A principal diferença que observei foi que a classe abstrata nos fornece algum comportamento comum já implementado e as subclasses precisam apenas implementar funcionalidades específicas correspondentes a elas. onde, quanto a uma interface, especificará apenas quais tarefas precisam ser executadas e nenhuma implementação será dada por ela. Posso dizer que especifica o contrato entre si e as classes implementadas.
fonte
Até eu já enfrentei a mesma pergunta em várias entrevistas e, acredite, torna seu tempo miserável para convencer o entrevistador. Se eu herdar todas as respostas acima, preciso adicionar mais um ponto-chave para torná-lo mais convincente e utilizar o melhor da OO
Caso você não esteja planejando nenhuma modificação nas regras , para que a subclasse seja seguida, por um longo futuro, vá para a interface, pois você não poderá modificá-la e, se fizer isso, precisará ir para o alterações em todas as outras subclasses, enquanto que, se você pensar, deseja reutilizar a funcionalidade, definir algumas regras e também torná-la aberta para modificação , vá para a classe Abstract.
Pense dessa maneira: você utilizou um serviço consumível ou forneceu algum código ao mundo e você tem a chance de modificar alguma coisa, suponha uma verificação de segurança. E se eu sou consumidor do código e encontre todas as marcas de leitura no meu Eclipse, todo o aplicativo está inoperante. Portanto, para evitar esses pesadelos, use Abstract over Interfaces
Eu acho que isso pode convencer o entrevistador até certo ponto ... Entrevistas felizes à frente.
fonte
Quando estou tentando compartilhar o comportamento entre duas classes estreitamente relacionadas, crio uma classe abstrata que mantém o comportamento comum e serve como pai das duas classes.
Quando estou tentando definir um Tipo, uma lista de métodos que um usuário do meu objeto pode chamar com segurança, eu crio uma interface.
Por exemplo, eu nunca criaria uma classe abstrata com 1 subclasse concreta, porque as classes abstratas são sobre o compartilhamento de comportamento. Mas eu poderia muito bem criar uma interface com apenas uma implementação. O usuário do meu código não saberá que existe apenas uma implementação. De fato, em uma versão futura, pode haver várias implementações, todas subclasses de alguma nova classe abstrata que nem existiam quando eu criei a interface.
Isso pode ter parecido um pouco muito estudioso também (embora eu nunca tenha visto isso dessa maneira em qualquer lugar que eu me lembre). Se o entrevistador (ou o OP) realmente quisesse mais da minha experiência pessoal nisso, eu estaria pronto com as histórias de uma interface que evoluiu por necessidade e vice-versa.
Mais uma coisa. O Java 8 agora permite inserir código padrão em uma interface, obscurecendo ainda mais a linha entre interfaces e classes abstratas. Mas, pelo que vi, esse recurso é usado em excesso mesmo pelos criadores das principais bibliotecas Java. Esse recurso foi adicionado, e com razão, para tornar possível estender uma interface sem criar incompatibilidade binária. Mas se você estiver criando um novo tipo definindo uma interface, a interface deverá ser APENAS uma interface. Se você também quiser fornecer código comum, faça uma classe auxiliar (abstrata ou concreta). Não bagunce sua interface desde o início com a funcionalidade que você deseja alterar.
fonte
A diferença básica entre interface e classe abstrata é que a interface suporta herança múltipla, mas a classe abstrata não.
Na classe abstrata, você também pode fornecer todos os métodos abstratos, como interface.
por que classe abstrata é necessária?
Em alguns cenários, ao processar a solicitação do usuário, a classe abstrata não sabe qual a intenção do usuário. Nesse cenário, definiremos um método abstrato na classe e solicitaremos ao usuário que estender essa classe, forneça sua intenção no método abstrato. Nesse caso, as classes abstratas são muito úteis
Por que a interface é necessária?
Digamos que tenho um trabalho que não tenho experiência nessa área. Por exemplo, se você deseja construir um edifício ou barragem, o que fará nesse cenário?
Aqui não me importo com a lógica de como eles construíram. O objeto final atendeu aos meus requisitos ou não, apenas o meu ponto-chave.
Aqui, seus requisitos chamados interface e construtores são chamados de implementador.
fonte
Em poucas palavras, eu responderia assim:
As classes abstratas podem ser tratadas como algo entre esses dois casos (ele introduz algum estado, mas também obriga a definir um comportamento); uma classe totalmente abstrata é uma interface (este é um desenvolvimento adicional de classes consistindo de métodos virtuais apenas em C ++ como até onde eu conheço sua sintaxe).
Obviamente, a partir do Java 8, as coisas mudaram um pouco, mas a ideia ainda é a mesma.
Eu acho que isso é bastante suficiente para uma entrevista típica de Java, se você não estiver sendo entrevistado para uma equipe de compiladores.
fonte
Pelo que entendi, uma Interface, composta de variáveis e métodos finais sem implementações, é implementada por uma classe para obter um grupo de métodos ou métodos relacionados entre si. Por outro lado, uma classe abstrata, que pode conter variáveis e métodos não finais com implementações, geralmente é usada como um guia ou uma superclasse da qual todas as classes relacionadas ou similares são herdadas. Em outras palavras, uma classe abstrata contém todos os métodos / variáveis compartilhados por todas as suas subclasses.
fonte
Na classe abstrata, você pode escrever a implementação padrão dos métodos! Mas na interface você não pode. Basicamente, na interface existem métodos virtuais puros que precisam ser implementados pela classe que implementa a interface.
fonte
Sim, suas respostas foram tecnicamente corretas, mas onde você errou não estava mostrando a elas que entende as vantagens e desvantagens de escolher uma sobre a outra. Além disso, eles provavelmente estavam preocupados / assustados com a compatibilidade de sua base de código com atualizações no futuro. Esse tipo de resposta pode ter ajudado (além do que você disse):
Boa sorte na sua próxima entrevista!
fonte
Vou tentar responder usando o cenário prático para mostrar a distinção entre os dois.
As interfaces são fornecidas com carga zero, ou seja, nenhum estado precisa ser mantido e, portanto, é a melhor opção para associar apenas um contrato (capacidade) a uma classe.
Por exemplo, digamos que eu tenha uma classe Task que execute alguma ação, agora, para executar uma tarefa em um thread separado, não preciso estender a classe Thread. A melhor opção é fazer com que o Task implemente a interface Runnable (ou seja, implemente o método run () ) e, em seguida, passe o objeto desta classe Task para uma instância Thread e chame seu método start ().
Bem, tecnicamente isso era possível, mas, em termos de design, essa teria sido uma má escolha:
Em outras palavras, a classe Task precisava de um recurso para ser executado em um encadeamento, o que foi alcançado implementando os versos da interface Runnable estendendo a classe Thread que o tornaria um encadeamento.
Disclaimer: exemplo bobo a seguir, tente não julgar :-P
Agora você tem a opção de ser semelhante a Deus, mas pode optar por ser apenas perdoador (ou seja, não semelhante a Deus) e fazer:
Ou você pode optar por ser semelhante a Deus e fazer:
O PS com a interface java 8 também pode ter métodos estáticos e padrão (implementação substituível) e, portanto, a diferença entre a interface preto e branco e a classe abstrata é ainda mais reduzida.
fonte
Quase tudo parece já estar coberto aqui .. Adicionando apenas mais um ponto na implementação prática da
abstract
classe:fonte
hmm agora as pessoas estão com uma abordagem prática da fome, você está certo, mas a maioria dos entrevistadores parece de acordo com as exigências atuais e deseja uma abordagem prática.
Depois de terminar sua resposta, você deve pular no exemplo:
Resumo:
por exemplo, temos a função salarial que possui algum parâmetro comum a todos os funcionários. então podemos ter uma classe abstrata chamada CTC com corpo de método parcialmente definido, que será estendido por todo tipo de funcionário e redefinido conforme seus valores extras. Para funcionalidade comum.
Interface
A interface em java permite ter funcionalidade entre interfaces sem estender essa e você precisa ser claro com a implementação da assinatura da funcionalidade que deseja introduzir em seu aplicativo. forçará você a ter uma definição. Para diferentes funcionalidades.
você também pode ter essa atividade forçada com a classe abstrata por métodos definidos como um abstrato, agora uma classe que estende a classe abstrata ou uma abstrata até que substitua essa função abstrata.
fonte
Pelo que entendi e como me aproximo,
Interface é como uma especificação / contrato, qualquer classe que implemente uma classe de interface precisa implementar todos os métodos definidos na classe abstrata (exceto os métodos padrão (introduzidos no Java 8))
Enquanto eu defino um resumo da classe quando conheço a implementação necessária para alguns métodos da classe e alguns métodos ainda não sei qual será a implementação (podemos conhecer a assinatura da função, mas não a implementação). Eu faço isso para que, mais tarde, na parte do desenvolvimento, quando eu sei como esses métodos sejam implementados, eu possa apenas estender essa classe abstrata e implementar esses métodos.
Nota: Você não pode ter o corpo da função nos métodos de interface, a menos que o método seja estático ou padrão.
fonte
Acredito que o que o entrevistador estava tentando chegar provavelmente fosse a diferença entre interface e implementação.
A interface - não uma interface Java, mas a "interface" em termos mais gerais - para um módulo de código é, basicamente, o contrato feito com o código do cliente que usa a interface.
A implementação de um módulo de código é o código interno que faz o módulo funcionar. Freqüentemente, você pode implementar uma interface específica em mais de uma maneira diferente e até alterar a implementação sem que o código do cliente esteja ciente da alteração.
Uma interface Java deve ser usada apenas como interface no sentido genérico acima, para definir como a classe se comporta em benefício do código do cliente usando a classe, sem especificar nenhuma implementação. Assim, uma interface inclui assinaturas de métodos - os nomes, tipos de retorno e listas de argumentos - para métodos que devem ser chamados pelo código do cliente e, em princípio, deve ter bastante Javadoc para cada método que descreve o que esse método faz. O motivo mais convincente para o uso de uma interface é se você planeja ter várias implementações diferentes da interface, talvez selecionando uma implementação dependendo da configuração da implantação.
Uma classe abstrata Java, por outro lado, fornece uma implementação parcial da classe, em vez de ter o objetivo principal de especificar uma interface. Deve ser usado quando várias classes compartilham código, mas quando também é esperado que as subclasses forneçam parte da implementação. Isso permite que o código compartilhado apareça em apenas um lugar - a classe abstrata -, deixando claro que partes da implementação não estão presentes na classe abstrata e que devem ser fornecidas pelas subclasses.
fonte
sua resposta está certa, mas o entrevistador precisa que você se diferencie de acordo com a perspectiva de engenharia de software e não com os detalhes de Java.
Palavras simples:
Uma interface é como a interface de uma loja, qualquer coisa que seja mostrada nela deve estar na loja; portanto, qualquer método na interface deve estar implementado na classe concreta. Agora, e se algumas classes compartilharem alguns métodos exatos e variarem em outras. Suponha que a Interface seja sobre uma loja que contenha duas coisas e que duas lojas contenham equipamentos esportivos, mas uma tenha roupas extras e a outra tenha sapatos extras. Então, o que você faz é criar uma classe abstrata para Sport que implemente o método Sports e deixe o outro método não implementado. A classe abstrata aqui significa que esta loja não existe, mas é a base para outras classes / lojas. Dessa forma, você está organizando o código, evitando erros de replicação, unificando o código e garantindo a reutilização por outra classe.
fonte