POLIMORFISMO - Exemplos

28 respostas
S

[size=“24”][color=“red”] Aí galera… sou novo neste mundo chamado JAVA. Portanto eu gostaria de receber ajuda. A primeira delas é o seguinte: expliquem me, com a maior clareza possível, o que é polimorfismo e por favor, coloquem um trecho de código fonte exemplificando tal conceito.

Desde já agradeço a atenção!

Spider[/color][/size]

28 Respostas

R

dá uma olhada neste tutorial …

http://www.portaljava.com.br/home/modules.php?name=Content&pa=showpage&pid=85

flw!

S

Valeu rcmsj

Dei uma lida no tutorial, mas pelo fato de eu ser ainda muuuuito calouro no assunto eu me perdi nas explicações (e olha que eu li uma, duas, três, quatro vezes seguidas…). Se você tiver um exemplo ainda mais simplório, poste-o aqui no forum beleza?

Mas de qualquer maneira, valeu mesmo pelo ajuda!

Spider

M

antes de tu querer saber a usar poliformismo, tu tem q estar confiante q conhece orientação ao objeto… se não for o caso, procure material sobre OO, q poliformismo será muito simples de saber depois… :slight_smile:

S

Bom dia Matheus

Na verdade, todos os conceitos de OO estão bem “frescos” na minha cabeça (herança, encapsulamento, polimorfismo etc etc etc), mas eu cansei de ficar só na teoria… Por isso peço aos amigos que postem pequenos (pequenos mesmo) trechos de código e expliquem passo-a-passo o que está acontecendo ao longo do mesmo.

Abraços

Spider

M

bem, se vc conhece OO, vai entender esse código, é um exemplo de poliformismo, onde eu chamo métodos com implementações diferentes de outros objetos na mesma referência:

interface Foo {

   public void doStuff();
}
class A implements Foo {

   public void doStuff() {

      System.out.println( "A" );
   }
}
class B implements Foo {

   public void doStuff() {

      System.out.println( "B" );
   }
}
class Test {

   public static void main( String args[] ) {

      Foo f[] = new Foo[2];

      f[0] = new A();
      f[1] = new B();

      for ( int i = 0; i < f.length; i++ )
         f[i].doStuff();
   }
}
S

Hummmm… agora está ficando mais claro. Como estou sem a JVM instalada aqui no meu computador não terei como executar este código imediatamente no meu computador, mas assim que chegar em casa farei a execução.

… mas pelo que eu entendi existem comportamentos diferentes para a implementação de um mesmo método através da implementação de uma interface, certo? Se eu estiver errado por favor me corrijam…

Abraços e mais uma vez muito obrigado Matheus

PS. Matheus, sabendo que você entende de Java, te incomodarei bastante daqui pra frente beleza??

M

certo, é isso mesmo… o método terá uma implementação diferente em diferentes objetos… é um exemplo de poliformismo…

ps: Come on, o Portal Java tem quase 18.000 usuários q entendem de java!!! :lol:

S

Aí Matheus… sem querer fugir do assunto do tópico, mas já fugindo, como é que faço para colocar um avatar diferente dos avatares disponíveis pelo próprio site??

M

na página do fórum, clique em Perfil, no final do formulário q vai aparecer terá um input text pra vc colocar a URL q vai ser exibido o teu avatar… a opção de upload não sei se esta funcionando, então tu precisa colocar ele em um server qualquer e linkar aqui

S

matheus

Andei analisando e pesquisando mais sobre o assunto POLIMORFISMO, e percebi que a galera o confunde muito com sobrecarga de métodos. Por favor me responde uma coisa: para se implementar o uso do conceito POLIMORFISMO, precisamos necessariamente de fazer o uso de uma interface? (no se exemplo, você usou a interface “Foo”)??

Grato, Spider

S

Não necessariamente, mas precisa ter uma relação de herança. A outra possibilidade é com superclasses e subclasses.[/code]

S

… mas espera aí: no exemplo citado pelo Matheus, não houve uma relação de herança… Houve sim uma implementação de interfaces (como eu já havia dito). Pode me explicar (e exemplificar com algum trecho de código)??

Abraços!

M

bem, ocorre q, qnd uma classe A extends uma classe B, uma instancia de A pode ser atribuida a uma referência de B. O mesmo ocorre se B fosse uma interface, onde uma classe A implements uma interface B, e uma instancia de A pode ser atribuída a uma referência de B. :joia:

L

matheus nao entendi o que vc fez

Foo f[] = new Foo[2];

Foo é uma interface vc não consegue criar uma instancia de interface acho que o que poderia fazer é

Foo f = new B();
 Foo f2 =  new A();
M
"lula":
matheus nao entendi o que vc fez
Foo f[] = new Foo[2];

Foo é uma interface vc não consegue criar uma instancia de interface acho que o que poderia fazer é

Foo f = new B();
 Foo f2 =  new A();

Bem, ocorre que isto:

Foo[] f = new Foo[2];

é diferente disso:

Foo f = new Foo();

Onde Foo é uma interface. Acontece q não estou instanciando um novo objeto Foo, e sim um novo array de objetos Foo, onde cada posição sim será uma instancia de uma classe q implementa Foo. :joia:

S

Hummm…

Gostei da observação do Lula e da resposta do Matheus… e aproveitando que o assunto está ficando mais quente, gostaria de saber se a afrimação com relação à linha de código abaixo está correta:

Foo f = new A();

“Está sendo criada um objeto f, instância da classe A e que implementa a interface Foo”

Estou certo?

S

Está, mas A TEM que implementar Foo ou gera erro de compilação.

S

[size=“18”][color=“red”]Beleza Schuenemann,

Você respondeu antecipadamente uma pergunta que eu iria fazer, ou seja, A tem que “implements” Foo… senão é pau na certa.

Mas para dar continuidade à nossa dicussão (que na minha opinião está sendo muito proveitosa para qualquer leigo que não conheça polimorfismo), você se arriscaria a colocar um trecho de código do mesmo porte que o anterior, que implemente os conceitos de polimorfimos mas SEM O USO DE INTERFACES??

Se você puder fazer isso agradeço muito…[/color][/size]

M

perfeitamente, ou vc faz uso de interfaces, ou faz uso de herança de classes…

S

Então teria como postar este trecho utilizando herança de classes?

Aproveitando a oportunidade, qual a diferença entre os dois trecho abaixo? (ambos foram utilizados nos posts acima):

Foo f[] = new Foo[2];

e

Foo[] f = new Foo[2];

M

“Spider_Man”:
Então teria como postar este trecho utilizando herança de classes?

public abstract class Father { // nao é necessario ser abstract

   public abstract void f();
}

public class Son1 extends Father {

   public void f() { System.out.println( "Son 1" ); }
}


public class Son2 extends Father {

   public void f() { System.out.println( "Son 2" ); }
}

class Foo {

   Foo () {

      Father f[] = new Father[2];

      f[0] = new Son1();
      f[1] = new Son2();
   }
}

nesse caso não tem diferença nenhuma, mas aqui sim:

Foo [] f1, f2, f2; // conchetes antes de tudo, declaração de 3 arrays
Foo f1[], f2, f3[]; // declaração de 2 arrays, f1 e f3
S

Não tem diferença nenhuma, mas a segunda forma é a padronizada e mais indicada, pela legibilidade.

Ao ler Foo[] você já entende que é um array de Foo. No primeiro caso, você só perceberia isso ao ver o f[], e numa leitura rápida poderia achar que seria um Foo simples (...)

O exemplo:
class Super {
    void m1() {
        System.out.println("Super");
    }
}

class Sub1 extends Super {
    void m1() {
        System.out.println("Sub1");
    }
}

class Sub2 extends Super {
}

class Teste {
    public static void main (String[] args) {
        Super s1 = new Super();
        Sub1  s2 = new Sub1();
        Sub2  s3 = new Sub2();        

        Super array = new Super[3];
        array[0] = s1;
        array[1] = s2;
        array[2] = s3;

        for (int i = 0; i < array.length; i++)
            System.out.print(array[i].m1());
}

Deve imprimir "SuperSub1Super"
S

Vixe :cool:

M

[color=“green”]Spider_Man,

As duas expressões querem dizer exatamente a mesma coisa… é só vc escolher a q achou mais bonitinha e usar… :lol:

A mais usada é a segunda: [/color]

Foo[] f = new Foo[2];

[color=“green”]Mas as duas funcionam viu? Espero ter ajudado. :wink: [/color]

M

[color=“green”]Eitaaaa… num tinha visto os posts do Matheus e do Schuenemann não… [/color] :oops: :oops: :oops: :oops: :oops:

M

heahea Marcela, o pessoal tem fome de posts com dúvidas :twisted: :twisted: :twisted:

e tem diferença sim galera… :joia:

“matheus”:

nesse caso não tem diferença nenhuma, mas aqui sim:

Foo [] f1, f2, f2; // conchetes antes de tudo, declaração de 3 arrays Foo f1[], f2, f3[]; // declaração de 2 arrays, f1 e f3

M

[color=“green”]E ae Matheus,

huehuehuehuehuehue… na próxima vez eu vou prestar mais atenção pra ver se tem alguém olhando o mesmo tópico q eu :wink:.

Sobre o array: nesse caso não existe diferença, como vc mesmo disse, só existe diferença se existir mais de uma variável não é isso??? [/color]

M

“MarcelaR”:
na próxima vez eu vou prestar mais atenção pra ver se tem alguém olhando o mesmo tópico q eu :wink:.

nd disso, quero ver todo mundo se brigando pra responder as dúvidas no fórum haehuae

bele… é q li o seu “é só vc escolher a q achou mais bonitinha e usar” e eu quis ressaltar :joia:

Criado 25 de abril de 2005
Ultima resposta 13 de mai. de 2005
Respostas 28
Participantes 6