In The last tutorial we discussed Polymorphism in Java. Neste guia veremos tipos de polimorfismo. Existem dois tipos de polimorfismo em java:
1) Estática Polimorfismo também conhecido como tempo de compilação polimorfismo
2) Dinâmica de Polimorfismo também conhecido como tempo de execução do polimorfismo
tempo de Compilação Polimorfismo (ou Estática polymorphism)
Polimorfismo que é resolvido durante o compilador de tempo é conhecido como polimorfismo estático. O overloading método é um exemplo de polimorfismo de tempo de compilação.
sobrecarga do método: isto nos permite ter mais de um método com o mesmo nome, se os parâmetros dos métodos são diferentes em número, sequência e tipos de dados de parâmetros. Já discutimos o overloading do método aqui: se você não leu esse guia, veja: sobrecarga do método em Java
exemplo de polimorfismo estático
sobrecarga do método é uma das formas como java suporta polimorfismo estático. Aqui temos duas definições do mesmo método add() que adicionar método seria chamado é determinado pela lista de parâmetros no momento da compilação. Essa é a razão pela qual isso também é conhecido como polimorfismo de tempo de compilação.
class SimpleCalculator{ int add(int a, int b) { return a+b; } int add(int a, int b, int c) { return a+b+c; }}public class Demo{ public static void main(String args) { SimpleCalculator obj = new SimpleCalculator(); System.out.println(obj.add(10, 20)); System.out.println(obj.add(10, 20, 30)); }}
saída:
3060
polimorfismo em tempo de execução (ou polimorfismo dinâmico)
é também conhecido como “Dynamic Method Dispatch”. Polimorfismo dinâmico é um processo no qual uma chamada para um método sobreposto é resolvida em tempo de execução, é por isso que é chamado de polimorfismo em tempo de execução. I have already discussed method priming in detail in a separate tutorial, refer it: Method Primering in Java.
exemplo
neste exemplo temos duas classes ABC e XYZ. ABC é uma classe de pais e XYZ é uma classe de crianças. A classe de crianças está sobrepondo o método mymetod() da classe de pais. Neste exemplo, temos objeto de classe-filho atribuído à referência da classe-mãe assim, a fim de determinar qual método seria chamado, o tipo do objeto seria determinado em tempo de execução. É o tipo de objeto que determina qual versão do método seria chamada (não o tipo de referência).
para compreender o conceito de sobrepor, você deve ter o conhecimento básico da herança em Java.
class ABC{ public void myMethod(){System.out.println("Overridden Method"); }}public class XYZ extends ABC{ public void myMethod(){System.out.println("Overriding Method"); } public static void main(String args){ABC obj = new XYZ();obj.myMethod(); }}
resultado:
Overriding Method
When an overridden method is called through a reference of parent class, then type of the object determines which method is to be executed. Assim, esta determinação é feita em tempo de execução.
uma vez que ambas as classes, classe de filhos e classe de pais têm o mesmo método animalSound
. Qual a versão do método(classe de filhos ou classe de pais) será chamada é determinada em tempo de execução pela JVM.
alguns exemplos mais importantes:
ABC obj = new ABC();obj.myMethod();// This would call the myMethod() of parent class ABCXYZ obj = new XYZ();obj.myMethod();// This would call the myMethod() of child class XYZABC obj = new XYZ();obj.myMethod();// This would call the myMethod() of child class XYZ
no terceiro caso, o método da classe infantil deve ser executado porque Qual método deve ser executado é determinado pelo tipo de objeto e como o objeto pertence à classe infantil, a versão da classe infantil de mymetod() é chamada.