OOP | Para principiantes | Dinâmico vs. Estático
Os quatro conceitos básicos de OOP (Programação Orientada a Objectos) são Herança, Abstracção, Polimorfismo e Encapsulamento. Para alguém que é novo no OOP, pode ser um pouco difícil no início compreender os últimos 3 conceitos básicos de OOP (uma vez que a Herança é um pouco fácil de compreender).
Polimorfismo é a capacidade de um objecto assumir muitas formas.
Um objecto Java que pode passar mais do que um teste IS-A é considerado polimórfico – tutorialspoint. Isto significa que qualquer objecto de classe criança pode assumir qualquer forma de classe na sua hierarquia de pais e, claro, também ele próprio. O que isto realmente significa é que o objecto de classe criança pode ser atribuído a qualquer referência de classe na sua hierarquia de pais e, claro, também a si próprio.
Eg: Digamos que a classe estudante é uma criança da classe Pessoa
Student student = new Student()
Person person = new Student()
O uso mais comum de polimorfismo no OOP ocorre quando uma referência de classe pai é utilizada para se referir a um objecto de classe criança. Na verdade, aqui fala-se de Polimorfismo Dinâmico (que descreverei a seguir).
Existem 2 tipos de polimorfismo que são comummente mencionados.
- Polimorfismo Dinâmico
- Polimorfismo Estático
Polimorfismo Dinâmico
Também é mencionado como Polimorfismo de Tempo de Execução, Ligação Dinâmica, Ligação de Tempo de Execução, Ligação Atrasada e Substituição do Método. Aqui ter muitas formas está a acontecer em diferentes classes.
É o que é normalmente conhecido como o chamado “polimorfismo”. Deixem-me explicar MUITO SIMPLES –
Vamos assumir que existem métodos com a mesma assinatura de método em classes numa hierarquia de classes (relações pai-filho), estes métodos estão em formas diferentes (isto é conhecido como substituição de método).
Então, quando um objecto é atribuído a uma referência de classe e quando um método do objecto é chamado, o método na classe do objecto é executado. Não o método da classe de referência (se a referência for uma classe pai).
O que acontece aqui é que, uma vez que a criação do objecto é feita em tempo de execução, a forma do método que deve ser executado (o método no objecto) só pode ser decidida em tempo de execução.
Eg: código Java
class Person {
public void teach(){
System.out.println("Person can teach");
}
}
class Teacher extends Person {
public void teach() {
System.out.println("Teacher can teach in a school");
}
}
public class TestTeacher {
public static void main(String args) {
Person person = new Person(); //Person reference and object
Person another_person = new Teacher(); //Person reference, Teacher object
Teacher teacher = new Teacher(); //Teacher reference and obj. person.teach();//output: Person can teach // Here you can see Teacher object's method is executed even-
// -though the Person reference was used
another_person.teach();//output: Teacher can teach in a school teacher.teach();//output: Teacher can teach in a school
}
}
Polimorfismo estático
Também é mencionado como Compile-Polimorfismo do tempo, Encadernação estática, encadernação Compilação-Tempo, encadernação precoce e sobrecarga do método. Aqui ter muitas formas está a acontecer na mesma classe.
se eu explicar isto SIMPLESMENTE..
Este é de facto uma sobrecarga do método. A sobrecarga do método é ter mais do que um método com o mesmo nome mas com argumentos diferentes (o tipo de retorno pode ou não ser o mesmo). Aqui, ao chamar o compilador de métodos, escolher qual o método a chamar, dependendo dos parâmetros passados na chamada. Isto acontece em tempo de compilação.
Eg: Java code
class Calculator {
void add(int a, int b) {
System.out.println(a+b);
}
void add(int a, int b, int c) {
System.out.println(a+b+c);
}
}public class Demo {
public static void main(String args) {
Calculator calculator = new Calculator(); // method with 2 parameters is called
calculator.add(10, 20); //output: 30 // method with 3 parameters is called
calculator.add(10, 20, 30); //output: 60
}
}
Algumas pessoas dizem que a sobrecarga do método não é verdadeiramente polimorfismo. Mas penso que pode ser categorizado como um tipo de polimorfismo uma vez que no método de sobrecarga há um método de muitas formas.
Espera que isto ajude a compreender o polimorfismo simplesmente.
Cheeers! 😀