Aquí hay un ejemplo simple de Java que muestra polimorfismo: sobrecarga y anulación.
El polimorfismo significa que las funciones asumen diferentes formas en diferentes momentos. En caso de tiempo de compilación, se denomina sobrecarga de funciones. La sobrecarga permite acceder a métodos relacionados mediante el uso de un nombre común. A veces se le llama polimorfismo ad hoc, a diferencia del polimorfismo paramétrico.
class A { public void M(int i){ System.out.println("int"); } public void M(String s){ //this is an overloading method System.out.println("string"); } } class B extends A{ public void M(int i){ //this is overriding method System.out.println("overriden int"); } } |
public static void main(String[] args) { A a = new A(); a.M(1); a.M("abc"); A b = new B(); b.M(1234); } |
Desde la perspectiva del compilador, ¿cómo se genera el código para las llamadas de función correctas?
La sobrecarga estática no es difícil de implementar. Al procesar la declaración de una función sobrecargada, un nuevo enlace la asigna a una implementación diferente. Durante el proceso de verificación de tipos, el compilador analiza el tipo real del parámetro para determinar qué función utilizar.
La sobrecarga dinámica permite elegir diferentes implementaciones de una función en el tipo de tiempo de ejecución de un parámetro real. Es una forma de envío dinámico.
El envío dinámico también se usa para implementar la anulación de métodos. El método anulado está determinado por el tipo de objeto real durante el tiempo de ejecución.
Para comprender el despacho dinámico, hay una publicación sobre el diseño de objetos en la memoria.