Pular para o conteúdo principal

Questão de Programação — Plataforma Java — FGV 2024

ProgramaçãoPlataforma Java
Código
fg075981
Banca
FGV
Órgão
AL-TO
Ano
2024
Nível
Superior
Cargo
Analista Legislativo - Desenvolvimento de Sistema
Considere o cenário de um sistema de gerenciamento de biblioteca, onde Livro representa diferentes tipos de livros e Biblioteca é uma classe que agrega esses livros, como mostra o diagrama a seguir.Imagem associada para resolução da questãoQuando executado, esse código exibirá o seguinte resultado:
  1. A1984 - Livro Físico Macunaíma - Livro Digital
  2. BLivro Físico – 1984 Livro Digital - Macunaíma
  3. C1984 Macunaíma
  4. DMacunaíma - Livro Digital 1984 - Livro Físico
  5. EErros de compilação ou exceções em tempo de execução
Revelar gabarito e comentário

GabaritoA — 1984 - Livro Físico Macunaíma - Livro Digital

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Programação Orientada a Objetos: Herança, Polimorfismo e Agregação em Java

Gabarito: letra A. O código exibe "1984 - Livro Físico\nMacunaíma - Livro Digital", pois a classe Biblioteca agrega objetos Livro e, ao iterar sobre eles, chama o método exibirDetalhes() que foi sobrescrito (override) nas subclasses LivroFisico e LivroDigital, demonstrando polimorfismo por inclusão. A ordem de exibição segue a ordem de inserção dos livros na lista da biblioteca.

A questão explora conceitos fundamentais de Programação Orientada a Objetos (POO) em Java: herança, polimorfismo e agregação. Herança é o mecanismo pelo qual uma classe (subclasse) herda atributos e métodos de outra (superclasse). No cenário, LivroFisico e LivroDigital são subclasses de Livro, herdando sua estrutura e comportamento. Polimorfismo, por sua vez, permite que um objeto de uma subclasse seja tratado como um objeto da superclasse, e que o método executado seja o da subclasse (override), não o da superclasse. Agregação é um tipo de associação onde uma classe contém objetos de outra, mas estes podem existir independentemente — a Biblioteca agrega Livro, mas os livros não são destruídos quando a biblioteca é destruída.

Na prática, quando o código percorre a lista de livros e chama exibirDetalhes(), o Java, em tempo de execução, verifica o tipo real do objeto (não o tipo da referência) e executa o método sobrescrito correspondente. Isso é o polimorfismo dinâmico ou por inclusão. A ordem de exibição é determinada pela ordem em que os livros foram adicionados à biblioteca, que, no diagrama, é primeiro o livro físico (1984) e depois o digital (Macunaíma).

A distinção crucial aqui é entre sobrescrita (override) e sobrecarga (overload). A sobrescrita ocorre quando uma subclasse redefine um método da superclasse com a mesma assinatura, permitindo o polimorfismo dinâmico. A sobrecarga ocorre quando métodos têm o mesmo nome, mas assinaturas diferentes (parâmetros diferentes), sendo resolvida em tempo de compilação. A banca explora a confusão entre esses conceitos, mas a questão central é a ordem de execução e o polimorfismo.

A pegadinha desta questão está em não considerar a ordem de inserção dos livros e o efeito do polimorfismo. O candidato pode se confundir e achar que a saída seria na ordem inversa ou que haveria erro de compilação. No entanto, o código é válido e a saída segue a ordem de adição, com cada livro exibindo seu tipo específico.

Guarde a fronteira entre herança (o que a classe é) e agregação (o que a classe tem), e entre sobrescrita (polimorfismo dinâmico) e sobrecarga (polimorfismo estático): é exatamente nesses pontos que as alternativas se dividem.

  1. 1Biblioteca agrega livros
  2. 2Itera na ordem de inserção
  3. 3Chama exibirDetalhes()
  4. 4Override da subclasse executa
  5. 5Exibe título e tipo
LEVEL · soulevel.com.br

Alternativa A — ✅ Correta ⟵ GABARITO

Esta alternativa reflete corretamente a execução do código. A Biblioteca agrega os livros na ordem: primeiro o LivroFisico (1984) e depois o LivroDigital (Macunaíma). Ao iterar, o método exibirDetalhes() é chamado polimorficamente, exibindo "1984 - Livro Físico" e "Macunaíma - Livro Digital", cada um em uma linha. A ordem é preservada conforme a inserção, e o polimorfismo garante que o método da subclasse seja executado.

Alternativa B — ❌ Incorreta

Esta alternativa inverte a ordem de exibição, colocando o tipo antes do título ("Livro Físico – 1984"). O código, conforme o diagrama, exibe primeiro o título e depois o tipo ("1984 - Livro Físico"). Além disso, a ordem dos livros está correta, mas o formato da saída está errado.

Alternativa C — ❌ Incorreta

Esta alternativa omite os tipos dos livros, exibindo apenas os títulos ("1984\nMacunaíma"). O método exibirDetalhes() nas subclasses inclui o tipo, portanto a saída deve conter tanto o título quanto o tipo. A alternativa está incompleta.

Alternativa D — ❌ Incorreta

Esta alternativa inverte a ordem dos livros, exibindo primeiro o digital (Macunaíma) e depois o físico (1984). A ordem de inserção na biblioteca é primeiro o físico, depois o digital, portanto a saída deve seguir essa ordem. Além disso, o formato "Macunaíma - Livro Digital" está correto, mas a ordem está errada.

Alternativa E — ❌ Incorreta

Esta alternativa sugere que haveria erros de compilação ou exceções em tempo de execução. O código é válido: as classes estão corretamente definidas, a agregação é bem formada e o polimorfismo é aplicado corretamente. Não há erros de sintaxe nem de lógica que causariam falhas na execução.

Gabarito: letra A

Link permanente: /questoes/fg075981