Questão de Programação — Linguagens de programação — CESPE / CEBRASPE 2023
- Código
- ce154091
- Banca
- CESPE / CEBRASPE
- Órgão
- DATAPREV
- Ano
- 2023
- Nível
- Médio
- Cargo
- Analista de Tecnologia da Informação - Perfil: Sustentação Tecnológica

- CCerto
- EErrado

GabaritoE — Errado
Gabarito: letra E (ERRADO). O código Java apresentado não imprime "SubA" — ele imprime "A", pois a variável de referência é do tipo da classe pai (A), e o método chamado é resolvido em tempo de compilação para o método da classe A, não da subclasse SubA. A pegadinha está em confundir a resolução de métodos com a resolução de atributos: métodos são polimórficos (resolvidos em tempo de execução), mas atributos são resolvidos em tempo de compilação, conforme o tipo da referência.
O conceito central aqui é o polimorfismo em Java, uma das bases da programação orientada a objetos. Polimorfismo significa "muitas formas": uma mesma referência pode apontar para objetos de tipos diferentes, e o comportamento executado depende do tipo real do objeto, não do tipo da referência. No entanto, essa regra se aplica a métodos — quando você chama um método por uma referência de um tipo, o Java decide em tempo de execução qual versão do método executar, baseado no tipo real do objeto. Já para atributos (variáveis de instância), a regra é diferente: eles são resolvidos em tempo de compilação, ou seja, o Java usa o tipo da referência para acessar o atributo, não o tipo real do objeto.
Vamos analisar o código típico dessa questão:
class A {
String nome = "A";
void imprimir() {
System.out.println(nome);
}
}
class SubA extends A {
String nome = "SubA";
}
public class Teste {
public static void main(String[] args) {
A obj = new SubA();
obj.imprimir();
}
}Aqui, obj é uma referência do tipo A, mas aponta para um objeto do tipo SubA. Quando chamamos obj.imprimir(), o método imprimir é definido apenas na classe A (a subclasse não o sobrescreve). Dentro desse método, a instrução System.out.println(nome) acessa o atributo nome. Como o atributo é resolvido em tempo de compilação, e o método imprimir está definido na classe A, o Java usa o atributo nome da classe A, que vale "A". Portanto, a saída é "A", não "SubA".
Se a intenção fosse imprimir "SubA", seria necessário sobrescrever o método imprimir na subclasse, ou acessar o atributo diretamente por uma referência do tipo SubA. Por exemplo:
SubA obj = new SubA();
System.out.println(obj.nome); // imprime "SubA"A distinção entre resolução de métodos e atributos é o ponto que a banca explora. Métodos são polimórficos (dynamic dispatch), atributos não. Essa é uma pegadinha clássica em questões de Java.
A banca explora a confusão entre a resolução de métodos e a resolução de atributos. O candidato pode pensar que, como o objeto é SubA, o atributo nome acessado será o da subclasse. Mas não: atributos são resolvidos em tempo de compilação, pelo tipo da referência. Métodos, sim, são resolvidos em tempo de execução. Guarde essa diferença — ela é a chave para não cair nesse tipo de armadilha.
A afirmação de que o resultado será "SubA" está errada. O código imprime "A", porque o método imprimir é definido na classe A e acessa o atributo nome da classe A, não o da subclasse. A resolução de atributos é feita em tempo de compilação, com base no tipo da referência (A), não no tipo real do objeto (SubA).
A afirmação de que o resultado será "SubA" é falsa — o resultado é "A". Portanto, o item está errado. A alternativa E é a correta, pois nega a afirmação do enunciado.
Gabarito: letra E (ERRADO).
Link permanente: /questoes/ce154091