sobreescritura sencillo resueltos polimorfismo metodos herencia ejercicios ejemplos ejemplo clase abstracta java inheritance method-overloading

sencillo - Reglas de sobrecarga y herencia de Java



polimorfismo java (3)

He estado estudiando porque tengo un examen y no tengo muchos problemas con la mayor parte de Java, pero tropecé con una regla que no puedo explicar. Aquí hay un fragmento de código:

public class A { public int method(Object o) { return 1; } public int method(A a) { return 2; } } public class AX extends A { public int method(A a) { return 3; } public int method(AX ax) { return 4; } } public static void main(String[] args) { Object o = new A(); A a1 = new A(); A a2 = new AX(); AX ax = new AX(); System.out.println(a1.method(o)); System.out.println(a2.method(a1)); System.out.println(a2.method(o)); System.out.println(a2.method(ax)); }

Esto devuelve:

1 3 1 3

Si bien espero que vuelva:

1 3 1 4

¿Por qué es que el tipo de a2 determina qué método se llama en AX?

He estado leyendo sobre las reglas de sobrecarga y la herencia, pero esto parece lo suficientemente oscuro como para no haber podido encontrar la regla exacta. Cualquier ayuda sería muy apreciada.


El comportamiento de estas llamadas a métodos está dictado y descrito por la Especificación del lenguaje Java (sección de referencia 8.4.9).

Cuando se invoca un método (§15.12), el número de argumentos reales (y cualquier argumento de tipo explícito) y los tipos de tiempo de compilación de los argumentos se usan, en tiempo de compilación, para determinar la firma del método que se invocará ( §15.12.2). Si el método que se va a invocar es un método de instancia, el método real que se invocará se determinará en tiempo de ejecución, utilizando la búsqueda dinámica de métodos (§15.12.4).

En su ejemplo, el compilador de Java determina la coincidencia más cercana en el tipo de compilación de la instancia en la que está invocando su método. En este caso:

A.method(AX)

El método más cercano es del tipo A, con la firma A.method(A) . En tiempo de ejecución, el envío dinámico se realiza en el tipo real de A (que es una instancia de AX) y, por lo tanto, este es el método que en realidad se llama:

AX.method(A)


Lo aclararé de una manera más simple. Ver cuando haces un objeto de clase secundaria con referencia de superclase como aquí lo hiciste.

Siempre hay una cosa que te recuerda que cuando llames con la referencia de superclase, no importa que el objeto sea de subclase, irá a la superclase, verificará el método con este nombre junto con la firma correcta allí o no.

ahora si lo va a encontrar, entonces, ¿comprobará si está anulado? si es así, irá al método de subclase como aquí fue. otro sabio ejecutará el mismo método de superclase.

Puedo darte el ejemplo ... solo esconder

public int method(A a) { return 3; }

método y verifique su respuesta obtendrá 1 2 1 2, por qué porque da prioridad a la referencia. porque lo anulaste y lo llamaste, ¡¡así que da 3 ... !! espero que sea grande pero fácil de entender. Feliz aprendizaje


a2 referenciado como A y la JVM usando la referencia primero (no el objeto acutal como esperaba).