Link sobre Polimorfismo em Java

Oi

Segue um link interessante explicando polimorfismo em Java.
Duas coisas importantes que eu concordo e que causam muita confusão

[list]polimorfismo nada mais é do que a chamada do método sendo executada de formas diferentes, o que depende do objeto chamador[/list]
[list]para termos polimorfismo não necessariamente precisamos de herança, podemos ter o mesmo comportamento usando interfaces[/list]

Sei que já foi muito batido esse assunto aqui, mas acho que quanto mais discussão melhor, o que acham? :slight_smile:

A palavra Herança, foi o que me matou por muito tempo para entender Polimorfismo em Java… não sei se é a mais adequada para explicar o que conhecemos como “HERANÇA”… acho que poderiam arranjar outro conceito melhor… mas pelo jeito a JAVA “Herdou” isso do C++, hehehehe

Perfeito o Link pra quem quer ter uma visão inicial e clara do conceito…

Falows :wink:

não é a toa que a Katty vive repetindo no livro Head First

Java NÃO é C++ :slight_smile:

hehehehe… pior…

O conceito de “herdar” pra mim, é bem diferente do que realmente ocorre quando nossa classe possui uma superclasse (ou seja, sempre)… mas como eu acho que não há uma palavra que defina o que realmente ocorre HERANÇA entrou por tabela…

Blz :slight_smile:

não li o artigo… então não sei bem o que ele quis dizer com

vou ler agora… mas c ele kiz dizer, que sobrecarga tem a ver com polimorfismo não esta correto… portanto o polimorfismo em se, não depende do objeto chamador, depende do objeto que esta sendo chamado… ou seja… vc tem um objeto, chama um método dele… e a depender da forma dentro do objeto, um comportamento diferente é executado…

vou ler, e depois entender o q ele kiz dizer e volto a falar

EDIT.: agora eu li, e realmente é muito bom o artigo, e totalmente coerente… mostra corretamente cada ponto… boa leitura a quem for ler

Perfeito … eu no início confundia mto polimorfismo com sobrecarga de métodos (na verdade até hj as vezes me enrolo um pko) … Mas quando vi acho q em um livro qualquer um exemplo do q eles denominaram polimorfismo dinâmico (pra mim o verdadeiro polimorfismo) q necessitava do uso d interfaces, fiquei deslumbrado com o potencial do verdadeiro polimorfismo … mto massa … por essas e outras q OO é massa … não q outros paradigmas não possam ser melhores … mas não é a toa q OO está aí até hj …

oi

pois é, ao invés de

melhor

:slight_smile:

com essa segunda frase fica bem + claro ^^

abraços

Nome mais bonitinho e enfeitado para POLIMORFISMO… não vejo um como estático, por isso, só polimorfismo já basta… hehehehe

Falows :wink:

eu so não concordo muito que o polimorfismo seja apenas na chamada do método… os tipos das variáveis em java tb são polimorficos, e é por isso que os métodos podem ser polimorficos, pois se não pudessomos passar varias formas para uma única variável tipada, não teriamos como chamar um método polimorficamente

Acho que o polimorfismo é além de uma “chamada de método”. É um grau de abstração perto de se imaginar oq é real: é o ato de um objeto tomar várias formas.
Essas várias formas são seus comportamentos em um determinado escopo. Esses comportamentos são por consequencia os metodos.

E Java, em tempo de compilação, “olha” para os tipos dos objetos. E executa o comportamento implementado nesses tipos.
Abraços pessoal, e nos vemos domingão no Falando em Java!

[quote=leandronsp]Acho que o polimorfismo é além de uma “chamada de método”. É um grau de abstração perto de se imaginar oq é real: é o ato de um objeto tomar várias formas.
Essas várias formas são seus comportamentos em um determinado escopo. Esses comportamentos são por consequencia os metodos.

E Java, em tempo de compilação, “olha” para os tipos dos objetos. E executa o comportamento implementado nesses tipos.
Abraços pessoal, e nos vemos domingão no Falando em Java!

[/quote]

so uma correção, ele executa o comportamento, e olha para o tipo em tempo de execução, e não de compilação… em tempo de compilação, ele apenas “tenta” (e quanto fala tenta, é pq ele não garante, por isso existe os CastClassException em tempo de execução) garantir que vc “não tente enfiar uma bicicleta onde deveria existir um espelho por exemplo”.

a definição de polimorfismo, feita pela Monica Pawlan , que é criticada pelo professor, pode ser encontrada aqui, deve ter sido ela quem escreveu já que ela trabalha na SUN…

aqui temos uma outra definição

Segundo essa definição polimorfismo poderia ser implementado usando overload ou overriding - multiple methods having the same name

aqui tem outra definição, segundo a qual podemos ter tres tipos de implementação

[list]overloading[/list]
[list]overriding através de herança[/list]
[list]overriding através de interface[/list]

e ainda aqui tem outra definição mais completa ainda, segundo a qual temos 4 tipos de implementalção, coerção, overloading, parametrica e inclusão, a parametrica acho que seria o que o Lavieri quis dizer

resumindo, a definição de polimorfismo é clara, agora parece que não chegaram ainda a um consenso na forma de implementa-la… :smiley:

nada é tão simples como parece… rs

[quote=Lavieri][quote=leandronsp]Acho que o polimorfismo é além de uma “chamada de método”. É um grau de abstração perto de se imaginar oq é real: é o ato de um objeto tomar várias formas.
Essas várias formas são seus comportamentos em um determinado escopo. Esses comportamentos são por consequencia os metodos.

E Java, em tempo de compilação, “olha” para os tipos dos objetos. E executa o comportamento implementado nesses tipos.
Abraços pessoal, e nos vemos domingão no Falando em Java!

[/quote]

so uma correção, ele executa o comportamento, e olha para o tipo em tempo de execução, e não de compilação… em tempo de compilação, ele apenas “tenta” (e quanto fala tenta, é pq ele não garante, por isso existe os CastClassException em tempo de execução) garantir que vc “não tente enfiar uma bicicleta onde deveria existir um espelho por exemplo”.[/quote]

seria isso?

Então eu sempre tive o seguinte:

Dada a Classe Soma a seguir:

[code]public class Soma {

public int Soma(int x, int y) {
return x+y;
}

public String Soma(String x, String y) {
return x+y;
}

public double Soma(double x, double y) {
return x+y;
}
}[/code]

tem-se a Classe Main

[code]public class Main {

public static void main(String[] args) {
    Soma soma = new Soma();
    double d = soma.Soma(0.5, 0.5);
    int i = soma.Soma(10, 10);
    String string = soma.Soma("Plataforma", "Java");
    System.out.println(d); //imprime 1.0
    System.out.println(i); // imprime 20
    System.out.println(string); //imprime Plataforma Java
}

}[/code]

Neste caso eu teria sobrecarga de método no método soma, ou polimorfismo estático (o polimorfismo dá-se em tempo de compilação)

No seguinte exemplo, polimorfismo dinâmico (o polimorfismo dá-se em tempo de execução), com o uso de Interface

[code]public interface Operacao {

int Calcular(int v1, int v2);

}[/code]

[code]public class Soma implements Operacao {

public int Calcular(int v1, int v2) {
    return v1+v2;
}

}[/code]

[code]public class Subtrair implements Operacao {

public int Calcular(int v1, int v2) {
    return v1-v2;
}

}[/code]

[code]public class Conta {

private static void mostrarResultado(Operacao op, int v1, int v2) {
    int resultado = op.Calcular(v1, v2);
    System.out.println(resultado);
}

public static void main(String[] args) {
    Soma soma = new Soma();
    Subtrair subtrair = new Subtrair();
    Conta.mostrarResultado(soma, 30, 20); //imprime 50
    Conta.mostrarResultado(subtrair, 30, 20); //imprime 10
}

}[/code]

Basicamente é assim q eu entendo polimorfismo hj … seria + ou - isso??

oi

o artigo utiliza a definição de 4 tipos de polimorfismo, como falei, coercion, overloading, parametric, inclusion

os dois primeiros tipos o autor considera polimorfismo ad-hoc, ou non-universal, algo como não verdadeiro ou simulado
os dois ultimos o autor considera como polimorfismo universal ou verdadeiro

[quote]Inclusion polymorphism exists when several subclasses use the method of the superclass (parent) to perform whatever action is required.
Overloading polymorphism exists when each subclass defines its own method of action, either because the parent class has declared the method abstract, or because it simply wishes to provide special processing. [/quote]

Ou seja, a diferença entre os dois é que no overloading vc reescreve o método do pai…

[quote]
Coercion polymorphism occurs when a primitive or object type is cast or “coerced” into being another primitive type or object type.[/quote]

Parametric corresponde a definição do tutorial da SUN

Coercion seria algo parecido com o que ocorre quando fazemos

[code]double d = 1.0 +2;

String s = “2” + 0;[/code]

acho que é o tipo mais dificil de polimorfismo de se definir

para as definições de tipos usei esta referência

t+

Mak,

Pelo que eu entendi, lendo as referências que passei, os exemplos que colocou seriam polimorfismo do tipo inclusion e overloading…

t+

eu discordo… em partes… hehehe

[code]
public class Main {

public static void main(String[] args) {  
    Soma soma = new Soma();  
    double d = soma.Soma(0.5, 0.5);  
    int i = soma.Soma(10, 10);  
    String string = soma.Soma("Plataforma", "Java");  
    System.out.println(d); //imprime 1.0  
    System.out.println(i); // imprime 20  
    System.out.println(string); //imprime Plataforma Java  
}  

} [/code]

neste exemplo ai… o único lugar onde há polimorfismo é no System.out.println(string) …

neste lugar onde, vc tem a forma String sendo enviada para um lugar onde espera-se uma forma Object… é valido, e logico que funciona … ai há sim o polimorfismo pq esse método aceita varias formas…

quanto aos métodos somas… não há polimorfismo… o fato é que existem varias sobrecagas de método… e isso em se, não é polimorfismo, é apenas um coincidencia de nomes, o que é permitido… cada objeto vai para o seu método adequado a ele… porem nada de polimorfismo esta ocorrendo… os métodos estão indo para onde deviam ir…

este seu código é o mesmo que escrever…

somaInt(int,int)
somaDouble(double,souble)
somaString(String,String)

isso é muito diferente…

quando há polimorfismo é quano realmente aceita-se muitas formas… por xemplo

System.out.println(Object) … aceita qualquer forma de objetc…
esse código vai chamar o método .toString() de object… e idependente da implementação, ele vai chamar o método correto, do objeto que esta la dentor… isso sim é polimorfismo, pq vc usa MUITAS FORMAS… esta assumindo que o método toString() tem uma forma diferente para cada objeto…

seu método soma não tem varias formas, ele apenas tem nomes coincidentes, com parametros distintos, é uma sobrecarga… e eles são idependentes um do outro… com sobriscrição não… quando vc sobrescreve… vc esta realmente eskecendo o antigo, e passando a exitir apenas o novo… msmo que vc tente reduzir ou ampliar o objeto na hierarquia de classes

[quote]quanto aos métodos somas… não há polimorfismo… o fato é que existem varias sobrecagas de método… e isso em se, não é polimorfismo, é apenas um coincidencia de nomes, o que é permitido… cada objeto vai para o seu método adequado a ele… porem nada de polimorfismo esta ocorrendo… os métodos estão indo para onde deviam ir…
[/quote]

Sim … então sobrecarga de métodos != polimorfismo … tbm concordo … pq realmente são apenas métodos com nomes iguais …

Valeu as explicações … no outro exemplo onde utilizei Inteface aí há polimorfismo??

[quote=Mak][quote]quanto aos métodos somas… não há polimorfismo… o fato é que existem varias sobrecagas de método… e isso em se, não é polimorfismo, é apenas um coincidencia de nomes, o que é permitido… cada objeto vai para o seu método adequado a ele… porem nada de polimorfismo esta ocorrendo… os métodos estão indo para onde deviam ir…
[/quote]

Sim … então sobrecarga de métodos != polimorfismo … tbm concordo … pq realmente são apenas métodos com nomes iguais …

Valeu as explicações … no outro exemplo onde utilizei Inteface aí há polimorfismo??[/quote]

um segundo é perfeito … o Operador é um exemplo de polimorfismo… é algo que relaiza operação, a operação em si, pode ser qualquer uma… o método não quer saber qual é operação, ele só pega e executa a operação do operador, com os argumentos passados, e ele faz isso idenpendente da forma do Operador… isso é sim polimorfismo… e é um bom exemplo