JavaRush /Blogue Java /Random-PT /10 perguntas abstratas da entrevista sobre classes e inte...

10 perguntas abstratas da entrevista sobre classes e interfaces Java

Publicado no grupo Random-PT
Classes e interfaces abstratas são muito populares em todas as linguagens de programação orientadas a objetos. E em quase todas as entrevistas sobre Java você se depara com pelo menos uma pergunta sobre esse assunto. As interfaces são mencionadas com mais frequência devido à sua popularidade entre os designers de software, mas questões sobre classes abstratas também surgem de tempos em tempos. Estas últimas são mais frequentemente feitas a candidatos ao cargo de desenvolvedores juniores, digamos, com não mais de dois anos de experiência em desenvolvimento Java, enquanto perguntas sobre interfaces são mais frequentemente encontradas durante entrevistas com aqueles cuja experiência já excedeu quatro anos. Geralmente são feitas em conjunto com outras perguntas sobre padrões de design Java, como os padrões Decorator ou Factory. 10 perguntas abstratas da entrevista sobre classes e interfaces Java - 1Neste artigo, veremos perguntas comuns sobre classes abstratas e interfaces que foram feitas em vários níveis de entrevistas Java. A maioria deles não deve ser difícil, mesmo para um programador Java novato. Em sua maioria, essas são questões de puro conhecimento, mas algumas delas, como as diferenças entre classes abstratas e interfaces em Java ou quando escolher uma classe abstrata em vez de uma interface , podem ser bastante complicadas. Oferecemos uma dúzia de perguntas interessantes sobre o assunto.
Se você já recebeu uma pergunta em uma entrevista ou teve que fazer alguma pergunta interessante sobre classes e interfaces abstratas, mas ela não está nesta lista, por favor, compartilhe nos comentários.

1. Uma classe abstrata pode ter construtores em Java?

Sim, em uma classe abstrata em Java você pode declarar e definir construtores. Como é impossível criar instâncias de classes abstratas, tal construtor só pode ser chamado ao formar uma cadeia de construtores, ou seja, ao criar uma instância de uma classe de implementação específica. Mas imagine que o entrevistador então faça a pergunta: qual é o sentido de um construtor se você não pode criar uma instância de uma classe abstrata de qualquer maneira? A questão é que ele ainda pode ser usado para definir os valores iniciais de variáveis ​​comuns declaradas em uma classe abstrata e usadas por diversas implementações. Mesmo que você não declare nenhum construtor, o compilador adicionará um construtor padrão sem argumentos à classe abstrata. Sem ele, sua subclasse não será compilada porque a primeira instrução em qualquer construtor é uma chamada implícita super()ao construtor padrão da superclasse em Java.

2. As classes abstratas em Java podem implementar interfaces? Eles precisam implementar todos os métodos?

Sim, classes abstratas podem implementar interfaces usando o implements. Por serem abstratos, não são necessários para implementar todos os métodos. Ter uma classe base abstrata e uma interface para declarar o tipo é uma prática recomendada. Um exemplo é uma interface java.util.Liste a classe abstrata correspondente java.util.AbstractList. Como AbstractListimplementa todos os métodos comuns, implementações específicas (como LinkedListe ArrayList) não precisam implementar todos os métodos, como seria o caso se implementassem a interface Listdiretamente. Esta solução combina o benefício de usar uma interface para declarar um tipo com a flexibilidade de uma classe abstrata para implementar todo o comportamento comum em um só lugar. No livro de Joshua Bloch “Java. Effective Programming” possui um excelente capítulo sobre o tema utilização de interfaces e classes abstratas em Java, para um melhor entendimento faz sentido estudá-lo.

3. Uma classe abstrata pode ser final?

Não, ele não pode. A palavra-chave finalsignifica que a classe está no topo da hierarquia e não pode ter descendentes. E uma classe abstrata sem herdeiros é um cavalo esférico no vácuo, pois é impossível criar uma instância abstract class. Assim, se uma classe for abstracte final, ela não terá descendentes e não poderá ser instanciada. O compilador Java gerará um erro se você criar uma classe abstracte final.

4. Uma classe abstrata em Java pode ter métodos estáticos?

Sim, classes abstratas podem declarar e definir métodos estáticos. É necessário apenas seguir os princípios gerais de criação de métodos estáticos em Java, uma vez que eles são indesejáveis ​​no design orientado a objetos, porque não é possível substituir métodos estáticos em Java. Métodos estáticos em uma classe abstrata são muito raros, mas se houver bons motivos para isso, nada o impedirá de usá-los.

5. É possível instanciar uma classe abstrata?

Não, você não pode fazer isso. A essência de uma classe abstrata é que ela não está completa e precisa ser completada em suas classes descendentes. Ou seja, esta classe não está pronta para uso. Por exemplo, pode faltar a implementação de alguns métodos. Como uma classe não está pronta para uso, seu objeto não pode ser criado. Mas você pode criar instâncias de herdeiros de uma classe abstrata. O compilador Java gerará um erro se um programa tentar instanciar uma classe abstrata.

6. É necessário que uma classe abstrata tenha métodos abstratos?

Não, uma classe abstrata não pode ter métodos abstratos. Você pode tornar uma classe abstrata em Java simplesmente usando uma palavra-chave abstractem sua declaração. O compilador imporá quaisquer restrições estruturais, como não permitir a criação de instanciações desta classe. A propósito, a questão de saber se deveria haver métodos abstratos em uma classe ou interface abstrata é controversa. Parece-me que uma classe abstrata deveria ter métodos abstratos, pois esta é a primeira coisa que um programador pensa ao ver uma classe abstrata. Isto se enquadra bem no princípio de minimizar surpresas.

7. Quais são as diferenças entre uma classe abstrata e uma interface em Java?

Esta é a pergunta mais importante e uma das mais clássicas da entrevista sobre Java. Não consigo contar quantas vezes já vi essa pergunta em entrevistas sobre Java em todos os níveis. O que torna esta questão interessante é, em particular, a oportunidade de o requerente fornecer um exemplo. Responder a perguntas sobre os fundamentos da programação orientada a objetos, como abstração, encapsulamento, polimorfismo e herança, é fácil, mas quando se trata de nuances tão sutis, os candidatos muitas vezes ficam confusos e dizem a primeira coisa que vem à mente. A resposta a esta pergunta merece um artigo separado (especialmente após mudanças no Java 8), porém, resumidamente:
  • Uma interface descreve apenas o comportamento (métodos) de um objeto, mas não possui estados (campos) (exceto public static final), enquanto uma classe abstrata pode tê-los.

  • Uma classe abstrata é herdada (estende) e uma interface é implementada (implementa). Podemos herdar apenas uma classe, mas implementar quantas interfaces quisermos. Uma interface pode estender (estender) outra interface/interfaces.

  • Classes abstratas são usadas quando há um relacionamento "é um", ou seja, a subclasse estende a classe abstrata base e as interfaces podem ser implementadas por diferentes classes que não estão relacionadas entre si.

8. Quando faz sentido preferir uma classe abstrata a uma interface e vice-versa?

Esta é uma continuação das questões anteriores sobre classes e interfaces abstratas. Se você sabe quais são suas diferenças sintáticas, responder a esta pergunta não lhe causará problemas, pois são elas o fator determinante na tomada de decisão. Como é quase impossível adicionar um novo método a uma interface publicada, é melhor usar uma classe abstrata em caso de necessidade potencial de desenvolvimento adicional. Desenvolver classes abstratas em Java é mais fácil do que desenvolver interfaces. Da mesma forma, se uma interface tiver muitos métodos e implementar todos eles se tornar uma verdadeira dor de cabeça, é melhor criar uma classe abstrata para a implementação padrão. Este padrão é seguido no pacote de coleções Java, a classe abstrata AbstractListfornece a implementação padrão para o List. Use classes abstratas se:
  • Você deseja compartilhar código entre várias classes intimamente relacionadas.

  • Você esperaria que as classes que estendem sua classe abstrata tivessem muitos métodos ou campos em comum ou que exigissem modificadores de acesso diferentes de public(por exemplo, protectede private).

  • Você deseja declarar не-finalcampos ou não estáticos. Isso permite definir métodos que podem acessar e alterar o estado do objeto ao qual pertencem.
Use interfaces se:
  • Você espera que classes não relacionadas implementem sua interface. Por exemplo, interfaces Comparablee Cloneablesão implementadas por muitas classes não relacionadas.

  • Você deseja definir o comportamento de um tipo de dados específico, mas não se importa com quem o implementa.

  • Você deseja usar herança de vários tipos.

9. O que é um método abstrato em Java?

Um método abstrato é um método sem corpo. Você simplesmente declara um método sem defini-lo, usando uma palavra-chave abstractna declaração do método. Todos os métodos declarados dentro de uma interface na linguagem Java são abstratos por padrão. Aqui está um exemplo de um método abstrato em Java:
public void abstract printVersion();
Agora, para implementar este método, você precisa estender a classe abstrata e substituir este método.

10. Uma classe abstrata em Java pode conter um método main?

Sim, uma classe abstrata em Java pode conter um método main, porque é apenas mais um método estático, e uma classe abstrata pode ser executada usando o método main, desde que você não a instancie. Isso é tudo que eu queria te contar. E lembre-se: classes e interfaces abstratas são decisões importantes de design no processo de análise e design orientado a objetos e devem ser usadas com o devido cuidado, é claro, se você quiser criar um sistema flexível.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION