JAVA继承:为什么在将其转换为父亲的方法时调用son方法?

时间:2019-03-27 16:01:18

标签: java inheritance

我的理解是,当上载对象时,会限制该对象的方法。 示例:Animal rambo = new Cat();

在那种情况下,您基本上是将Cat的方法简化为动物中的方法。 但是,在我调用saludo()时编写的代码中,我希望从“ Padre”接收它,但没有。我是从“涅托”或“尼塔”那里收到的。

f[i].saludo();//I'm expecting it from Padre

知道为什么吗?

public class Padre{

    public void saludo() {
        System.out.println("Hola desde Padre");
    }
}
public class Nieto extends Padre{

    public void saludo() {
        System.out.println("Hola desde Nieto");
    }

}
public class Nieta extends Padre{

    public void saludo() {
        System.out.println("Hola desde Nieta");
    }

}

public class main {

    public static void main(String[] args) {

        Padre[] f = new Padre[10];

        f[0] = new Nieto();
        f[1] = new Nieta();

        f[2] = (Nieto)f[0];

        for(int i = 0; i<3 ; i++) {
            if(f[i] instanceof Nieto) {
                System.out.println("f[" + i + "] es una instancia de Nieto");
                f[i].saludo();//I'm expecting it from Padre
            }else if(f[i] instanceof Nieta) {
                System.out.println("f[" + i + "] es una instancia de Nieta");
                f[i].saludo();//I'm expecting it from Padre
            }           
        }

    }

}

结果:

f[0] es una instancia de Nieto
Hola desde Nieto

f[1] es una instancia de Nieta
Hola desde Nieta

f[2] es una instancia de Nieto
Hola desde Nieto

2 个答案:

答案 0 :(得分:0)

这是继承的工作方式。

saludo()中的

Nieto正在掩盖saludo()中的Padre。 如果Padre具有saludo1(),则Nieto将具有saludo()saludo1()。来自Padre的saludo和来自其自身的saludo1

This期刊开发链接通过示例详细介绍了该主题。

答案 1 :(得分:0)

  

我的理解是,当上载对象时,会限制该对象的方法。

是,不是。

  

EX:Parent parent = new Nieta()在那种情况下,您基本上是将Nieta的方法简化为Parent中的方法。 (已更改以匹配您的代码)

在强制转换之后,确实会受到Parent声明的方法的限制。但是NietoNieta提供了这些方法的自己的实现。数组中的对象都不是Padre的实例。这就是为什么您在输出中看不到“ Hola desde Padre”的原因。

换句话说,Parent定义了一个称为saludo()的职责。 Nieta以自己的方式履行了这一责任。这是面向对象的多态性和封装。