¿Por qué el polimorfismo no importa cuando un método está sobrecargado?

Sé que los métodos sobrecargados se determinan en tiempo de compilación según el tipo de referencia que invoca el método, mientras que los métodos anulados están determinados por el tipo de objeto real de la referencia que invoca el método, la pregunta es ¿por qué el polimorfismo solo importa sobreescribir y no sobrecargar?

preguntado el 22 de mayo de 12 a las 21:05

¿A qué te refieres con "solo importa"? Sería útil si pusieras un ejemplo concreto, diciendo qué pasar y lo que harías esperar que suceda. -

no entiendo la pregunta La sobrecarga es otro polimorfismo, esta vez de funciones en lugar de objetos. ¿A qué te refieres exactamente con 'no importa'? -

4 Respuestas

El mecanismo de implementación que hace posible el polimorfismo en Java es el despacho dinámico de un método basado en el tipo de tiempo de ejecución de su primer argumento (en una llamada a.method(b, c), a puede considerarse el primer argumento del método). Java es por lo tanto un despacho único Lenguaje orientado a objetos. El resultado es que todos los demás argumentos no participan en este mecanismo y su tipo se determina estáticamente en tiempo de compilación. Entonces, por ejemplo, si tienes

class MyObject {
  public boolean equals(MyObject o) { ... }
}

y entonces

MyObject m1 = new MyObject();
Object o = new MyObject();
System.out.println(m1.equals(o));

nunca se puede imprimir true ya que su método no está siendo llamado. El compilador vio una llamada MyObject.equals(Object) y lo compiló como una llamada del método heredado Object.equals(Object). El mecanismo de envío del método de tiempo de ejecución solo decidirá qué método anular equals(Object) llamar.

contestado el 23 de mayo de 12 a las 09:05

@Eslam Puedo intentarlo, pero deberá cooperar: ¿qué entiende exactamente en mi respuesta y qué no entiende exactamente? - Marko Topolnik

polimorfismo, como su nombre lo indica, es cuando un método "de la misma forma" manifiesta diferentes comportamientos en diferentes contextos. El término "misma forma" significa "misma firma". Eso implica que no puede relacionar el polimorfismo con métodos sobrecargados porque, para empezar, tienen "formas diferentes". Otra forma de pensarlo es: necesita un tipo y un subtipo para ver el polimorfismo en acción: los métodos sobrecargados nuevamente se definen en el contexto de una sola clase.

contestado el 22 de mayo de 12 a las 21:05

Esto es por razones técnicas. Usualmente solo el this puntero, como primer parámetro oculto del método, se analiza en tiempo de ejecución para determinar el método que se va a llamar.

Cuando también se analizan otros parámetros, se denomina Envío múltiple. Hay algunos idiomas que admiten el envío múltiple de forma nativa.

contestado el 22 de mayo de 12 a las 21:05

Estás confundido con esto.
Overloading se refiere a seleccionar uno de los métodos que tienen el mismo nombre pero diferente firma en el mismo clase (no jerarquía).
Overriding se elige entre los métodos del mismo nombre según el tipo de tiempo de ejecución entre los heredados por las clases principales.
Si tiene una clase base y una clase derivada con un método del mismo nombre y firma, entonces esto es overriding y en tiempo de ejecución se determina el correcto.

Para overloading el compilador elige la versión correcta del método a utilizar, entre los disponibles en el misma clase.
No es necesario encontrar un tipo de tiempo de ejecución. El compilador puede resolver esto en tiempo de compilación

contestado el 22 de mayo de 12 a las 21:05

No es mío, pero supongo que es porque OP declaró en la pregunta que ya entiende los conceptos, pero se pregunta POR QUÉ hay tanta diferencia. - Marko Topolnik

No estás ayudando con esta explicación. Para empezar, es objetivamente incorrecto y, aparte de eso, simplifica las cosas hasta el punto de la incorrección. Ver estratos.me/2008/07/… - San Jacinto

@MarkoTopolnik: Pero creo que abordé esto. Mi punto es que no hay necesidad de encontrar un tipo de tiempo de ejecución para los métodos de sobrecarga, ya que la sobrecarga no es relevante para la herencia. - Cratilo

No se permite una firma dos o más veces en la misma clase (lea el enlace y vea la definición de firma). Dará como resultado un error en tiempo de compilación. Para una anulación, el nombre es irrelevante; el firma es lo que importa Si un método en la clase B tiene el mismo nombre que uno en la clase A, pero una firma diferente, esto no es una anulación y el método se puede vincular en tiempo de compilación. - San Jacinto

A signature is not permitted twice or more in the same class. Oh, ok, corregí estas malas declaraciones. - Cratilo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.