我的理解是,当上载对象时,会限制该对象的方法。
示例: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
答案 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
声明的方法的限制。但是Nieto
和Nieta
提供了这些方法的自己的实现。数组中的对象都不是Padre
的实例。这就是为什么您在输出中看不到“ Hola desde Padre”的原因。
换句话说,Parent
定义了一个称为saludo()
的职责。 Nieta
以自己的方式履行了这一责任。这是面向对象的多态性和封装。