Pular para o conteúdo principal

Questão de Programação — Programação Orientada a Objetos — Avança SP 2024

ProgramaçãoProgramação Orientada a Objetos
Código
qg078057
Banca
Avança SP
Órgão
CISBRA - SP
Ano
2024
Nível
Superior
Cargo
Analista em T.I
Sobre a sobrecarga, em programação orientada a objetos, é correto afirmar que:
  1. Amétodos sobrecarregados devem ter o mesmo número de parâmetros.
  2. Baplica-se apenas a métodos.
  3. Cresolve o problema da ambiguidade de nome.
  4. Dpermite substituir um valor de subtipo por um par‚âetro formal que é um supertipo.
  5. Emétodos sobrecarregados devem ter o mesmo tipo de retorno.
Revelar gabarito e comentário

GabaritoD — permite substituir um valor de subtipo por um par‚âetro formal que é um supertipo.

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

Sobrecarga (Overload) em Programação Orientada a Objetos

Gabarito: letra D. A sobrecarga (overload) é um tipo de polimorfismo estático que permite que uma classe tenha vários métodos com o mesmo nome, mas com assinaturas diferentes (diferentes tipos, quantidades ou ordem de parâmetros). A alternativa D, embora redigida de forma confusa, descreve o princípio da substituição de Liskov (LSP), que é um conceito relacionado ao polimorfismo e à herança, e não diretamente à sobrecarga. No entanto, a banca considerou esta a correta, pois a sobrecarga permite que um método aceite um parâmetro de um subtipo onde um supertipo é esperado, desde que haja uma relação de herança. As demais alternativas apresentam erros conceituais claros sobre a definição de sobrecarga.

A sobrecarga é um dos pilares do polimorfismo, especificamente o polimorfismo estático (ou em tempo de compilação). Ela ocorre quando dois ou mais métodos na mesma classe têm o mesmo nome, mas assinaturas diferentes. A assinatura de um método é composta pelo nome e pela lista de parâmetros (tipos, quantidade e ordem). O tipo de retorno não faz parte da assinatura para fins de sobrecarga. Isso significa que você pode ter:

public int somar(int a, int b) { return a + b; }
public double somar(double a, double b) { return a + b; }
public int somar(int a, int b, int c) { return a + b + c; }

Todos esses métodos são sobrecargas do método somar. O compilador decide qual método chamar com base nos argumentos passados na chamada. Por exemplo, somar(1, 2) chama o primeiro, somar(1.5, 2.5) chama o segundo, e somar(1, 2, 3) chama o terceiro.

A sobrecarga é uma forma de polimorfismo ad hoc, que permite que o mesmo nome de método seja usado para operações relacionadas, mas com tipos ou quantidades de parâmetros diferentes. Isso melhora a legibilidade do código, pois evita a criação de nomes distintos para operações semelhantes (ex.: somarInteiros, somarDecimais).

É fundamental distinguir sobrecarga de sobrescrita (override). A sobrescrita é o polimorfismo dinâmico (em tempo de execução) e ocorre quando uma subclasse redefine um método da superclasse, mantendo a mesma assinatura (nome, parâmetros e tipo de retorno). A sobrecarga, por outro lado, ocorre na mesma classe e envolve assinaturas diferentes.

Critério

Sobrecarga (Overload)

Sobrescrita (Override)

Onde ocorre

Na mesma classe

Entre superclasse e subclasse

Assinatura

Diferente (parâmetros diferentes)

Igual (mesmos parâmetros e retorno)

Tipo de polimorfismo

Estático (tempo de compilação)

Dinâmico (tempo de execução)

Palavra-chave

Nenhuma específica

@Override (em Java)

Objetivo

Oferecer várias versões do mesmo método

Redefinir o comportamento de um método herdado

A alternativa D, apesar de ser o gabarito, é a mais controversa. Ela menciona "substituir um valor de subtipo por um parâmetro formal que é um supertipo". Isso se refere ao Princípio da Substituição de Liskov (LSP), que afirma que objetos de uma subclasse devem ser substituíveis por objetos da superclasse sem afetar a corretude do programa. Na prática, isso significa que, se um método espera um parâmetro do tipo Animal, você pode passar um objeto do tipo Cachorro (que é um subtipo de Animal). A sobrecarga, em conjunto com a herança, permite que isso aconteça, pois o compilador pode resolver a chamada para o método mais específico. No entanto, a redação da alternativa é imprecisa e poderia ser interpretada como uma descrição do LSP, e não da sobrecarga em si. A banca, no entanto, considerou que a sobrecarga "permite" essa substituição, o que é verdadeiro em um contexto mais amplo de polimorfismo.

A pegadinha desta questão é que a banca mistura conceitos de sobrecarga com o princípio da substituição de Liskov. O candidato que conhece bem a definição clássica de sobrecarga (mesmo nome, parâmetros diferentes) pode estranhar a alternativa D, mas ela é a única que não apresenta um erro conceitual grosseiro. As alternativas A, B, C e E contêm afirmações falsas sobre a sobrecarga.

1Polimorfismo estático
Mesmo nome, assinaturas diferentes
Parâmetros: tipo, quantidade ou ordem
Tipo de retorno não conta
2Onde ocorre
Métodos
Construtores
3Distinção da sobrescrita
Sobrescrita: subclasse, mesma assinatura
Sobrecarga: mesma classe, assinatura diferente
Sobrecarga (overload)
LEVELsoulevel.com.br
Sobrecarga (overload): Polimorfismo estático (Mesmo nome, assinaturas diferentes, Parâmetros: tipo, quantidade ou ordem, Tipo de retorno não conta); Onde ocorre (Métodos, Construtores); Distinção da sobrescrita (Sobrescrita: subclasse, mesma assinatura, Sobrecarga: mesma classe, assinatura diferente)

Alternativa A — ❌ Incorreta

Afirma que métodos sobrecarregados devem ter o mesmo número de parâmetros. Isso é falso. A sobrecarga exige que as assinaturas sejam diferentes, e isso pode ser alcançado variando o número de parâmetros, os tipos dos parâmetros ou a ordem deles. Por exemplo, metodo(int a) e metodo(int a, int b) são sobrecargas válidas, mesmo com números diferentes de parâmetros. O que não pode ser igual é a assinatura completa.

Alternativa B — ❌ Incorreta

Afirma que a sobrecarga se aplica apenas a métodos. Isso é falso. A sobrecarga também pode ser aplicada a construtores. É muito comum ter vários construtores em uma classe, cada um com uma lista de parâmetros diferente, para permitir a criação de objetos de diferentes formas. Por exemplo, uma classe Pessoa pode ter um construtor Pessoa() e outro Pessoa(String nome, int idade). Isso é sobrecarga de construtor.

Alternativa C — ❌ Incorreta

Afirma que a sobrecarga resolve o problema da ambiguidade de nome. Isso é falso. A sobrecarga cria métodos com o mesmo nome, o que poderia gerar ambiguidade, mas o compilador a resolve analisando a assinatura. O problema que a sobrecarga resolve é o de evitar criar nomes diferentes para operações semelhantes, melhorando a legibilidade. A ambiguidade de nomes é resolvida pelo compilador, não pela sobrecarga em si.

Alternativa D — ✅ Correta ⟵ GABARITO

Esta é a alternativa considerada correta pela banca. Embora a redação seja confusa, ela descreve o Princípio da Substituição de Liskov (LSP), que está relacionado ao polimorfismo. A sobrecarga, em conjunto com a herança, permite que um método aceite um parâmetro de um subtipo onde um supertipo é esperado. Por exemplo, se um método void alimentar(Animal a) existe, e Cachorro é uma subclasse de Animal, você pode chamar alimentar(meuCachorro). Isso é possível porque Cachorro é um subtipo de Animal. A sobrecarga permite que você tenha também void alimentar(Cachorro c), e o compilador escolherá a versão mais específica. Portanto, a sobrecarga "permite" essa substituição, no sentido de que ela faz parte do mecanismo de polimorfismo que viabiliza o LSP.

Alternativa E — ❌ Incorreta

Afirma que métodos sobrecarregados devem ter o mesmo tipo de retorno. Isso é falso. O tipo de retorno não faz parte da assinatura do método para fins de sobrecarga. Dois métodos podem ter o mesmo nome e parâmetros, mas tipos de retorno diferentes, e isso não é considerado sobrecarga válida (na verdade, isso geraria um erro de compilação, pois a assinatura seria a mesma). Para que haja sobrecarga, a lista de parâmetros deve ser diferente. O tipo de retorno pode ser igual ou diferente, desde que os parâmetros sejam diferentes.

Gabarito: letra D

Link permanente: /questoes/qg078057