Questão de concurso [Resolvido]

12 respostas
romarcio

O polimorfismo em Java pode ser por sobrecarga ou sobreposição. Analise as declarações de classes para identificar
aquelas com declarações de métodos polimórficos por sobrecarga.

I. class Data { int setData (float width, float height, float length) { ?} int setData (float width) {?} int setData (int width, int height) {?} }
II. class Tool { Object setData (int width) {?} } class Data extends Tool { int setData (float width, float height) {?} int setData (int width) {?} }
III. class Tool { Object setData (float width, float height) {?} } class Data extends Tool { int setData (float width, float height) {?} }

A (s) declaração (ões) de classe (s) identificada (s) corretamente encontra (m)-se em

A.I apenas.
B.II apenas.
C.III apenas.
D.I e II apenas.
E.II e III apenas.

Como fala isso na questão: .…métodos polimórficos por sobrecarga. eu achei que fosse a letra B, mas no gabarito está como a letra D.
O que vocês acham?

12 Respostas

A

a opção III ta errada por que quando a classe Data estende Tools, ela simplemente implemente o seu método, e não está ocorrendo sobregarda de métodos como na I e na II…

A

Dizemos que o método foi sobrecarregado quando sua assinatura é modificada, ou seja: a declaração de parâmetros passados para o método variaram em quantidade ou em tipos. É o que vemos em I e II, então bate com o gabarito.

romarcio

ADEMILTON:
Dizemos que o método foi sobrecarregado quando sua assinatura é modificada, ou seja: a declaração de parâmetros passados para o método variaram em quantidade ou em tipos. É o que vemos em I e II, então bate com o gabarito.

Isso eu sei, é que eu fiquei em dúvida na questão do polimorfismo envolvido na questão.

Polimorfismo pra mim é algo que resulta de Herança, o que acontece na opção II e não acontece na opção I.

Tipo:

class Animal {
   public void eat() {}
}

class Dog extends Animal {
  //sobre carga 
  public void eat(int x) {}

  public static void main(String args) {
     //aqui polimorfismo.
    Animal a = new Dog();
    a.eat(1);
  }
}
Eric_Yuzo

O polimorfismo proporcionado pela herança seria em relação ao tipo, assim como está no seu comentário.

Quando se usa sobrecarga há um polimorfismo com métodos. Pois eles tem o mesmo nome, mas possuem assinatura diferente e podem ter implementações diferentes.

Y

Se considerar a origem da palavra, entao overload é um tipo de polimorfismo sim. Embora nos costumamos ouvir polimorfismo só em casos de metodos iguais implementados por subclasses.

Nao sei se existe algo que seja comumente aceito sobre o que pode ou nao pode ser considerado polimorfismo em software. Nesse caso overload pode ser considerado sim.

Apesar que eu acho que isso so vai confundir quem le sobre o assunto.

Mais sobre o assunto:
http://www.guj.com.br/posts/list/54387.java

romarcio

YvGa:
Se considerar a origem da palavra, entao overload é um tipo de polimorfismo sim. Embora nos costumamos ouvir polimorfismo só em casos de metodos iguais implementados por subclasses.

Nao sei se existe algo que seja comumente aceito sobre o que pode ou nao pode ser considerado polimorfismo em software. Nesse caso overload pode ser considerado sim.

Apesar que eu acho que isso so vai confundir quem le sobre o assunto.

Mais sobre o assunto:
http://www.guj.com.br/posts/list/54387.java

Obrigado pelo link, mas parece ser um assunto difícil de se chegar a uma decisão.

Por exemplo, no livro de certificação da Keithy Sierra, quando se fala em polimorfismo, se fala em herança. Por esse motivo é que fico mais em dúvida se apenas uma sobrecarga em uma mesma classe, sem herança envolvida, poderia ser polimorfismo.

novato25

Ué… mas não está certo? em I apresenta polimorfismo por sobrecarga e em II apresenta tanto polimorfismo por sobrecarga quanto por sobreposição. Já na III apresenta apenas polimorfismo por sobreposição. Como se está perguntando qual ou quais declarações contém métodos polimórficos por sobrecarga, as opções seriam I e II. Ou seja, letra D. :smiley:

S
romarcio:
Polimorfismo pra mim é algo que resulta de Herança, o que acontece na opção II e não acontece na opção I.
Sobrecarga também é conhecida como polimorfismo estático. E polimorfismo dinâmico resulta de herança em Java. Em linguagens de tipagem dinâmica, tipo Ruby, Python, JavaScript, você pode ter isso:
class A {
  def metodo
  end
}

class B {
  def metodo
  end
}

def metodo_qualquer(obj)
  obj.metodo
end
Aceitando tanto objetos de A quanto de B, sem haver herança envolvida.

A III está errada porque ele alterou o retorno.

romarcio

Eu deveria ter analisado melhor a Pergunta, e ver que estavam referenciando o Polimorfismo a sobrecarga e sobreposição, e não ao polimorfismo referente a herança.

É que nunca tinha avaliado uma sobrecarga ou sobreposição como sendo algo polimórfico, então acabei de cara descartando a alternativa I.

novato25

Bom, em relação ao polimorfismo estão corretas a I e a II. Mas a II e a III não compilam por causa da mudança do tipo de retorno dos métodos sobrepostos.

romarcio

A a 3 não compila por que quando se sobrescreve um método, o retorno deve ser igual ou um retorno que seja uma subclasse do retorno do método original.
Por exemplo:

class Tool {
Object setData (float width, float height) {?}
}
class Data extends Tool {
//String é uma classe, que herda de Object por definição da linguagem, então seria aceita a mudança de parametro.
String setData (float width, float height) {?}
}

Mas no caso, o tipo int é um primitivo, não uma classe.

novato25

A a 3 não compila por que quando se sobrescreve um método, o retorno deve ser igual ou um retorno que seja uma subclasse do retorno do método original.
Por exemplo:

class Tool {
Object setData (float width, float height) {?}
}
class Data extends Tool {
//String é uma classe, que herda de Object por definição da linguagem, então seria aceita a mudança de parametro.
String setData (float width, float height) {?}
}

Mas no caso, o tipo int é um primitivo, não uma classe.

Exatamente. Bom, mas este mesmo problema também ocorre com o item II com o método setData(int width).

II.

class Tool {
Object setData (int width) {?} //retorno Object
}
class Data extends Tool {
int setData (float width, float height) {?}
int setData (int width) {?} //retorno int
}
Criado 17 de outubro de 2010
Ultima resposta 18 de out. de 2010
Respostas 12
Participantes 7