Pular para o conteúdo principal

Questão de Programação — Linguagens de programação — CESPE / CEBRASPE 2023

ProgramaçãoLinguagens de programação
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
No que se refere a Shell Script e a Java, julgue o item a seguir.O resultado da execução do código a seguir, escrito em Java, será SubA.Imagem associada para resolução da questão
  1. CCerto
  2. EErrado
Revelar gabarito e comentário

GabaritoE — Errado

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”.

Java: herança e polimorfismo — o resultado da execução

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.

NÃO CAIA NESSA!

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.

1Métodos
Resolvidos em tempo de execução
Usam o tipo real do objeto
2Atributos
Resolvidos em tempo de compilação
Usam o tipo da referência
3Pegadinha clássica
Referência A → objeto SubA
Método da classe A acessa atributo da classe A
Resultado: "A", não "SubA"
Polimorfismo em Java
LEVELsoulevel.com.br
Polimorfismo em Java: Métodos (Resolvidos em tempo de execução, Usam o tipo real do objeto); Atributos (Resolvidos em tempo de compilação, Usam o tipo da referência); Pegadinha clássica (Referência A → objeto SubA, Método da classe A acessa atributo da classe A, Resultado: "A", não "SubA")

Alternativa C — ❌ Incorreta

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).

Alternativa E — ✅ Correta ⟵ GABARITO

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