Reglas de sobrecarga y herencia de Java


He estado estudiando porque tengo un examen y no tengo muchos problemas con la mayoría de Java, pero me topé 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

Mientras que yo esperaría que volviera:

1 3 1 4

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

He estado leyendo sobre la sobrecarga de las reglas y la herencia, pero esto parece lo suficientemente oscuro que no he sido capaz de encontrar la regla exacta. Cualquier ayuda sería muy apreciada.

Author: Lugaid, 2012-06-20

3 answers

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

Cuando se invoca un método (§15.12), el número de argumentos reales (y argumentos de tipo explícitos) y los tipos en tiempo de compilación del argumentos se utilizan, en tiempo de compilación, para determinar la firma de la método que se invocará (§15.12.2). Si el método que va a ser invoked es un método de instancia, el método real que se invocado será determinado en tiempo de ejecución, usando búsqueda de método dinámico (§15.12.4).

En su ejemplo, el compilador 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 actual de A (que es una instancia de AX), y por lo tanto este es el método que realmente se llama:

AX.method(A)
 28
Author: Perception,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-31 03:36:28

Lo aclararé de una manera más simple. Vea cuando hace un objeto de subclase con referencia de superclase como lo hizo aquí.

Siempre una cosa mantenga en su mente que cuando se llama con referencia super clase, no importa objeto es de sub clase irá a la super clase, comprobar método con este nombre junto con la firma adecuada está allí o no.

Ahora bien, si lo encuentra, entonces comprobará si está anulado?? si es así, irá al método de la subclase como aquí se fue. otro sabio ejecutará el mismo método de la clase estupenda.

Les puedo dar el ejemplo de ello...solo escóndete

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

Método y verifique su respuesta obtendrá 1 2 1 2, por qué porque le da la primera prioridad a la referencia. debido a que lo anuló y que lo llama, por lo que su dar 3..!! espero que sea grande pero fácil de entender. Feliz aprendizaje

 4
Author: Sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-15 08:07:10

A2 referenciada como una A y la JVM usando la referencia primero (no el objeto acutal como se esperaba).

 1
Author: Lakatos Gyula,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-19 23:19:40