¿Por qué buscar la JVM para un método de hijo a padre en el árbol de herencia?

M06494h:

Aquí está el código de ejemplo que estoy mirando y me gustaría saber por qué la JVM siempre busca un método en una clase hija cuando un método similar está presente en la matriz y cuando la referencia es de tipo padre pero el objeto es de tipo niño.

class A{
    public void saveLink(){
        System.out.println("A: saveLink");
        bookmark();
    }
    public void bookmark() {
        System.out.println("A: bookmark");
    }
}

class B extends A{
    public void bookmark(){
        System.out.println("B: bookmark");
    }
}

class C extends B{

}   

class Test {
    public static void main(String[] args) {
        A a = new A();
        A b = new B();
        A c = new C();

        c.saveLink();
    }
}

Cuando ejecuto el código anterior se da salida:

A: saveLink
B: bookmark

Por favor alguien puede explicar más sobre esto?

ernest_k:

Esta es una de las formas en que el polimorfismo se implementa en Java. Se conoce como la unión dinámica.

La aplicación que se ejecuta en tiempo de ejecución se determina observando la clase real del objeto sobre el que se llama al método.

En su caso, cuando se declara A b = new B();y luego llamada b.bookmark(), Java busca primero en el tiempo de ejecución, el tipo real del objeto ( Bes el tipo de tiempo de ejecución que el objeto fue creado con new B()), independientemente de su estática o tipo declarado (es decir, regarless del declarada tipo de la variable que apunta al objeto).

Cuando Java ve que el método ha sido reemplaza en la clase en tiempo de ejecución (este es el caso para el objeto ben su ejemplo), que se ejecuta la aplicación. De lo contrario, se acerca la jerarquía de clases para encontrar una aplicación heredada, como lo ha anotado (este es el caso para el objeto cen su ejemplo).


Tenga en cuenta:

  • Este comportamiento es sólo para los de los métodos de instancia (no se aplica a los métodos estáticos o campos). Los métodos estáticos se eligen basándose en el tipo declarado / estático.
  • Hay una excepción (que se me ocurre): cuando la llamada se realiza con super.bookmark(), a continuación, ejecutar Java necesariamente la aplicación de la superclase - esto no es un escenario en su ejemplo.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=192705&siteId=1
Recomendado
Clasificación