Polimorfismo

8 respostas
A

Ola
eu sempre imaginei que o Polimorfismo se fazia na mesma classe e em Classes diferentes como nas superclasses e subclasses…

mas um amigo meu que esta estudando Java na faculdade disse pra mim que o professor dele disse que Polimorfismo é apenas em SuperClasse e subclasses, exempo

class A {
  public void escrever() {
    System.out.println("metodo 1");
  }
}

public class B extends A {
  public B {
    escrever();
    escrever(10);
  }
  
  public void escrever(int valor) {
    System.out.println(valor);
  }
  
  public static void main(String args[]) {
    new B();
  }

}

no Caso o polimorfismo iria funcionar legal, até ae tudo bem… mas o professor dele disse que quando for na mesma classe invés de chamar de polimorfismo, chama de sobrecarga ou overload, exemplo

public class B{
  public B {
    escrever();
    escrever(10);
  }
  
  public void escrever() {
    System.out.println("metodo 1");
  }

  public void escrever(int valor) {
    System.out.println(valor);
  }
  
  public static void main(String args[]) {
    new B();
  }

}

Pergunta… quando for na mesma classe não é considerado Polimorfismo??

Obrigado

8 Respostas

elvishr

Overload é quando um método possui várias chamadas, várias definições, mas com argumentos diferentes, tipo assim:



escrever(String texto) {



}
escrever(String texto, int tamanho) {



}

escrever() {

escrever(sem texto)

}


quando for chamado o método escrever, de acordo com o argumento passado, ele irá executar o chamador adequado para o método. pode ser:

escrever()

escrever(nome)

escrever(nome”, 10)

No caso do Polimorfismo é quando uma classe pode assumir várias formas de acordo com o método adquado. Tipo assim:

Filho extends Pai
Filho2 extends Pai
Filho3 extends Pai

quando é chamado o método para um Objeto que referencia a (Filho) ou (Filho2) ou (Filho3), esse método irá assumir formas diferentes, porque foram herdados de Pai, mas foram sobrescritos diferentemente em cada classe Filho.

deu pra entender? :wink:

A

então o código abaixo

class A { 
  public void escrever() { 
    System.out.println("metodo 1"); 
  } 
} 

public class B extends A { 
  public B { 
    escrever(); 
    escrever(10); 
  } 
  
  public void escrever(int valor) { 
    System.out.println(valor); 
  } 
  
  public static void main(String args[]) { 
    new B(); 
  } 

}

é um Polimorfismo então??

obrigado pela dica

elvishr

Parece ser um caso de Herança e não de polimorfismo, porque a classe B herda de A, na definição do construtor, a linha:

escrever();

é meio estranho, na verdade deveria ser super.escrever(), pois assim estaria chamando o método definido na sua superclasse. Do jeito que está, está chamando um método escrever sem argumento que está defnido na própria classe B.

Polimorfismo é com Superclasse e subclasses mas o código do jeito q está parece meio confuso, alguém me corrija se estiver errado mas não acho este um bom exemplo de polimorfismo.

A

Ae elvis…
entao cara, ae que deve estar o polimorfismo… porque eu chamando os métodos
escrever()
e escrever(10)

o Java vai saber qual método ele vai usar, o escrever sem parametros que esta na superclasse e o escrever int que esta na subclasse… o java consegue distinguir qual vai usar…

eu até poderia usar o super.escrever() mas ae eu estaria indicando na mão que eu quero o método da superclasse…
o super é mais usado em overriding
quando por exemplo eu tenho dois metodos escrever sem parametros identicos um na superclasse e um na subclasse…
ae pra chamar da superclasse eu ponho super.escrever e da subclasse apenas escrever ou this.escrever

Javaneses, estou correto? ou viajei? rsss. isso seria um polimorfismo entao?

valeu

Paulo_Silveira

Eh. Isso ai que ta acotnecendo eh um simples overlaod de metodos. Ou sobrecarga de metodos. Eh um nome bonito, mas nao tem nada de especial!
O overloading soh tem esse nome porque as linguagens antigas nao costumavam aceitar funcoes/metodos com o mesmo nome.
Ei, to acessando o GUJ do lynx, funciona tudo! GUJ lynx compatible.

elvishr

ae Alex, vc tá certo, até q pensei nessa hipótese mas julguei mal,
valeu pela dica…

Mas qdo tenho um objeto referenciando subclasses de uma superclasse e qdo chamo o método tbem acontece o polimorfismo não é?
agora to certo?

:lol:

rarondini

Polimorfismo: “Capacidade de um objeto em decidir que metodo aplicar a si mesmo, dependendo de onde ele esta na hierarquia de herança”
(Core Java - Vol. 1 - Fundamentos - Horstmann / Cornell)

Talvez ate pode-se chamar as duas formas de polimorfismo, tanto overload como overriding.

A diferença basica eh a forma como ambas são tratadas pelo compilador.

No caso do overload, que é a definicao de metodos numa mesma classe, com o mesmo nome e lista de argumentos diferentes, o compilador sabe qual e o metodo que esta sendo chamado, em função do parametro que eh passado. Isso é chamado de early bind ou static binding.

No caso de overriding, em que os metodos sao redefinidos nas sub-classes exatamente da mesma maneira que foram definidos na super-classe, o compilador não sabe o metodo de qual classe esta sendo chamado. Este e conhecido como late biding ou dinamicy biding.
Quando um metodo e chamado em uma classe que esta na hierarquia de herança, primeiro e verificado se a sub-classe tem o metodo, se nao tiver, sera verificado na classe imediatamente acima e assim ate chegar a ultima classe da hierarquia.

elvishr

essa foi boa rondini… valeu pela explicação…

Criado 30 de abril de 2003
Ultima resposta 30 de abr. de 2003
Respostas 8
Participantes 4