Introdução ao polimorfismo de tempo de execução em Java

Neste artigo, vamos aprender sobre o polimorfismo de tempo de execução em Java. "Poli" significa "muitos" e "morph" significa "tipo". Portanto, o termo polimorfismo indica a mesma coisa para diferentes tipos. Aqui veremos como o Java arquiva o polimorfismo em tempo de execução, ou seja, após a compilação, mas antes da execução do código.

Sintaxe:

Para polimorfismo de tempo de execução em Java, você deve seguir a sintaxe básica de java com anotações. @Override anotação @Override pode ser usada aqui para apontar especificamente qual método queremos substituir.

Como o polimorfismo de tempo de execução funciona em Java?

O polimorfismo de tempo de execução funciona em Java por substituição de método. A substituição do método acontece quando os objetos têm o mesmo nome, argumentos e tipo de método e tipo da classe pai, mas com funcionalidade diferente. Se uma classe filho possui esse tipo de método, chamamos de método substituído.

Por que é chamado polimorfismo de tempo de execução?

quando chamamos um método substituído de classe filho por meio de sua referência de tipo pai (esse fenômeno em java é chamado de "Upcasting"), o tipo do objeto indica qual método ou funcionalidade será chamado. A tomada dessa decisão ocorre durante o tempo de execução pela JVM após a compilação do código. Por isso, é chamado de polimorfismo em tempo de execução.

Também é conhecido como "envio de método dinâmico". A razão foi nomeada assim, devido ao fato de que a funcionalidade do método é decidida dinamicamente no tempo de execução, conforme o objeto da JVM

Também é chamado de "Ligação tardia", porque a ligação do método e do objeto, que significa a funcionalidade do método de qual objeto será exibido, é decidida tardiamente, ou seja, após a compilação.

Regras e Limitações no Runtim e Polimorfismo

Abaixo estão algumas das regras e limitações do polimorfismo de tempo de execução:

Regras do polimorfismo de tempo de execução

  • Os métodos da classe filho e pai devem ter o mesmo nome.
  • Os métodos da classe filho e pai devem ter o mesmo parâmetro.
  • O relacionamento IS-A é obrigatório (herança).

Limitações do polimorfismo de tempo de execução

  • Não se pode substituir métodos privados de uma classe pai.
  • Não se pode substituir os métodos finais.
  • Não se pode substituir métodos estáticos.

Exemplos de polimorfismo de tempo de execução em Java

Discutiremos alguns exemplos de código do polimorfismo em tempo de execução aqui.

Exemplo 1

Neste exemplo, mostraremos como o método showcase () está exibindo mensagens diferentes, dependendo do tipo de objeto ao qual está associado. Quando está associado ao tipo "Pais", está mostrando mensagens da classe pai. Enquanto que, quando associado ao tipo "Filhos", ele mostra mensagens da classe filho.

Código:

class Parents (
public void showcase () (
System.out.println("I am Parent");
)
)
class Children extends Parents (
@Override
public void showcase () (
System.out.println("I am Children");
)
)
public class RunTimePolymorphism (
public static void main(String args()) (
Parents superObject = new Parents();
superObject.showcase(); //method of super class or parent class is called
Parents subObject = new Children(); // upcasting
subObject.showcase();//method of sub class or child class is called by Parent reference, this is called "Run time Polymorphism"
Children subObject2 = new Children();
subObject2.showcase(); //method of sub class or child class is called
)
)

Resultado:

Exemplo 2

Vamos dar um exemplo de polimorfismo em tempo de execução no caso de herança multinível. Neste exemplo, levamos em consideração dois níveis de herança. Neste exemplo, mostraremos como o método sip () está exibindo mensagens diferentes, dependendo do tipo de objeto ao qual está associado. Quando está associado ao tipo "Humano", está mostrando mensagens de uma classe pai. Enquanto que, quando associado ao tipo "Man", ele mostra mensagens de sua classe filho. Novamente, no segundo nível de herança, quando associado ao tipo "Bebê", ele mostra mensagens da classe filho de seus pais, que é a classe "Homem".

Código:

class Human(
void sip() (
System.out.println("Human is sipping");
)
)
class Man extends Human(
void sip()(
System.out.println("Man is sipping soup");
)
)
class Baby extends Man(
void sip()(
System.out.println("Baby is sipping milk");
)
)
public class RunTimePolymorphism (
public static void main(String args())(
Human superObject=new Human();
Human subObject=new Man(); // // upcasting : first level of heritance
Human babyObject=new Baby(); // // upcasting : second level of heritance
superObject.sip();
subObject.sip(); //run time polymorphism happening in first level of heritance
babyObject.sip(); //run time polymorphism happening in second level of heritance
)
)

Resultado:

Exemplo 3

Vamos dar outro exemplo de polimorfismo em tempo de execução no caso de herança multinível. Neste exemplo, temos três níveis de herança que são levados em consideração. Neste exemplo, mostraremos como o recurso do método () está exibindo recursos diferentes, dependendo do tipo de objeto ao qual está associado. Quando está associado ao tipo de "sistema operacional", está mostrando mensagens de uma classe pai. Enquanto que, quando associado ao tipo "DOS", ele mostra mensagens de sua classe filho. Novamente, no segundo nível de herança, quando associado ao tipo "Windows", ele mostra mensagens da classe filha do pai, que é a classe "DOS". Novamente no terceiro nível de herança, quando associado ao tipo "WindowsMobile", ele mostra mensagens da classe filha do pai, que é a classe "Windows".

Código:

class OperatingSytem(
void feature() (
System.out.println("This is Operating Sytem");
)
)
class DOS extends OperatingSytem(
void feature()(
System.out.println("This is DOS");
)
)
class Windows extends DOS(
void feature()(
System.out.println("This is Windows");
)
)
class WindowsMobile extends Windows(
void feature()(
System.out.println("This is Windows Mobile");
)
)
public class RunTimePolymorphism (
public static void main(String args())(
OperatingSytem superObject=new OperatingSytem();
OperatingSytem subObject=new DOS(); // child object type : first level of heritance
OperatingSytem sub2Object=new Windows(); // child object type : second level of heritance
OperatingSytem sub3Object=new WindowsMobile(); // child object type : third level of heritance
superObject.feature();
subObject.feature(); //run time polymorphism happening in first level of heritance
sub2Object.feature(); //run time polymorphism happening in second level of heritance
sub3Object.feature(); //run time polymorphism happening in third level of heritance
)
)

Resultado:

Conclusão

Isso conclui nosso aprendizado do tópico "Polimorfismo de tempo de execução em Java". Escreva você mesmo os códigos mencionados nos exemplos acima no compilador java e verifique a saída. O aprendizado dos códigos ficará incompleto se você não escrever o código sozinho.

Artigos recomendados

Este foi um guia para o polimorfismo de tempo de execução em Java. Aqui discutimos como o polimorfismo de tempo de execução funciona em java com exemplos. Você também pode consultar os seguintes artigos para saber mais -

  1. Palavra-chave estática em Java
  2. Substituindo em Java
  3. O que é polimorfismo?
  4. Rust vs Golang