Considere o seguinte trecho de código em Java. Considerando...
Considerando os conceitos de orientação a objetos e que o código será compilado e executado em condições ideais, é correto afirmar que
Comentários
Veja os comentários dos nossos alunos
1ª linha da saída:
- nproc é do tipo A, e está instanciado como new A()
- Vai chamar o método processo(String param) da classe A
- Saída: "A: teste"
2ª linha da saída:
- Aqui tentamos fazer casting de um objeto da classe A para a classe B
- Só que nproc foi criado com new A() — ele não é um objeto da classe B
- Esse cast vai compilar, mas em tempo de execução causará erro
Alternativa Correta: E
Acho controversa a explicação, o cast não funciona não por nproc não ser um objeto da classe B, mas por não ser derivado de B. Se for de qualquer subclasse de B vai funcionar, e não me parece que se use como o padrão dizer que um objeto da classe derivada seja da classe originária.
Linha 1:
- Cria um objeto da classe A (não de B!), com referência do tipo A.
Linha 2:
- Chama o método no objeto que é uma instância de A.
- Como o objeto real é A (não B), executa o método de A → retorna .
Linha 3:
- Aqui está o ponto crítico: tenta fazer um downcast de (que é realmente uma instância de A) para B.
- Em Java, o cast compila normalmente (pois B é subclasse de A, então é sintaticamente válido).
- Porém, em tempo de execução, a JVM verifica se o objeto realmente é uma instância de B. Como foi criado como , ele NÃO é instância de B.
- Isso lança uma em tempo de execução.
Avaliando as alternativas:
- ❌ A, B, C: Estão erradas porque o programa não chegará a imprimir a segunda linha (lançará exceção antes).
- ❌ D: Errada. O código compila normalmente — o cast entre A e B é sintaticamente válido (são classes relacionadas por herança).
- ✅ E: Correta. O código compila, mas lança em tempo de execução, porque foi instanciado como e não pode ser convertido para B.
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo