¿Por qué el método que obtiene la clase padre como un parámetro se llama y no el método que obtiene la clase del niño como parámetro?

Ronen Hanukayev:

Tengo una clase llamada A, y una clase llamada B que se extiende A. Jugando con algunos métodos para entender el comportamiento polimórfico, me encontré con una situación extraña.

public class Main {
    public static void main(String[] args){
        B b = new B();
        A a = b;
        b.f1(a);
    }
}

public class A {
.
.
.
    public void f1(A a){
        if(a instanceof B)
            f1((B)a);
        else
            System.out.println("Nothing");
    }
.
.
.
}

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

Yo esperaba f1 en la clase A a ser llamados por primera vez (debido a es de tipo A) que en realidad sucedió. Entonces me esperaba la f1 línea ((B) a); a ser llamado, ya que una es una instancia de B. Hasta ahora todo ha ido como se esperaba. Sin embargo, pensé que el siguiente método que se llama es f1 (B) en la clase B. En cambio, f1 (A) en la clase A se llamó una y otra causando una excepción de desbordamiento de pila. ¿Por qué no se f1 (B) en la clase B llama? Una instancia de B era la persona que llama y el parámetro fue arrojado a tipo B.

Eran :

f1(A a)es un método de instancia de la clase A. No tiene conocimiento de los métodos de las subclases de A. Por lo tanto, no se puede llamar void f1(B b)de clase B. Por lo tanto, f1((B)a)ejecuta void f1(A a)de nuevo.

Si desea llamar f1(B b), usted tiene que llamar f1a una variable de instancia de la clase B:

public void f1(A a){
    if(a instanceof B) {
        B b = (B)a;
        b.f1(b);
    } else {
        System.out.println("Nothing");
    }
}

Supongo que te gusta

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