POP | Para principiantes | Dinámica vs. Estática
Los cuatro conceptos básicos de la POO (Programación Orientada a Objetos) son la Herencia, la Abstracción, el Polimorfismo y la Encapsulación. Para alguien que es nuevo en la POO puede ser un poco difícil al principio entender los últimos 3 de los conceptos básicos de la POO (ya que la Herencia es un poco fácil de entender).
El polimorfismo es la capacidad de un objeto de tomar muchas formas.
Cualquier objeto de Java que puede pasar más de una prueba IS-A se considera polimórfico- tutoriales. Esto significa que cualquier objeto de clase hijo puede tomar cualquier forma de una clase de su jerarquía padre y, por supuesto, de sí mismo también. Lo que realmente significa es que el objeto de clase hijo puede ser asignado a cualquier referencia de clase en su jerarquía padre y por supuesto a sí mismo también.
Eg: Digamos que la clase Estudiante es un hijo de la clase Persona
Student student = new Student()
Person person = new Student()
El uso más común del polimorfismo en la POO se produce cuando una referencia de clase padre se utiliza para referirse a un objeto de clase hijo. En realidad aquí se habla de Polimorfismo Dinámico (que describiré a continuación).
Hay 2 tipos de polimorfismo que se mencionan comúnmente.
- Polimorfismo dinámico
- Polimorfismo estático
Polimorfismo dinámico
También se menciona como polimorfismo en tiempo de ejecución, enlace dinámico, enlace en tiempo de ejecución, enlace tardío y anulación de métodos. Aquí teniendo muchas formas está sucediendo en diferentes clases.
Esto es lo que comúnmente se conoce como el llamado «polimorfismo». Permítanme explicarlo MUY SIMPLEMENTE –
Supongamos que hay métodos con la misma firma de método en las clases de una jerarquía de clases (relaciones padre-hijo), estos métodos están en diferentes formas (esto se conoce como overriding de métodos).
Entonces, cuando un objeto se asigna a una clase de referencia y cuando se llama a un método del objeto, se ejecuta el método de la clase del objeto. No el método de la clase de referencia (si la referencia es una clase padre).
Lo que ocurre aquí es que como la creación del objeto se hace en tiempo de ejecución la forma del método que se debe ejecutar (el método en el objeto) sólo se puede decidir en tiempo de ejecución.
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
También se menciona como Compile-Time polymorphism, Vinculación estática, vinculación en tiempo de compilación, vinculación temprana y sobrecarga de métodos. Aquí tener muchas formas está sucediendo en la misma clase.
Si explico esto SIMPLEMENTE..
Esto es en realidad la sobrecarga de métodos. La sobrecarga de métodos es tener más de un método con el mismo nombre de método pero con diferentes argumentos (el tipo de retorno puede o no ser el mismo). Aquí al llamar a los métodos compilador elegir qué método para llamar en función de los parámetros pasados al llamar. Esto ocurre en tiempo de compilación.
Eg: código Java
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
}
}
Algunas personas dicen que la sobrecarga de métodos no es verdaderamente polimorfismo. Pero creo que se puede categorizar como un tipo de polimorfismo ya que en la sobrecarga de métodos hay un método de muchas formas.
Espero que esto haya ayudado a entender el polimorfismo de forma sencilla.
¡Cheeers! 😀