Java 为什么可以';我是否使用引用子类型实例的父类型引用调用子类方法?
我正在学习Java,同时试图理解继承。我不明白为什么子类walk()中被重写的方法被执行,而另一个xyz()方法没有执行 我的问题是,如果下面的方法调用工作正常,并调用士兵方法walkJava 为什么可以';我是否使用引用子类型实例的父类型引用调用子类方法?,java,inheritance,Java,Inheritance,我正在学习Java,同时试图理解继承。我不明白为什么子类walk()中被重写的方法被执行,而另一个xyz()方法没有执行 我的问题是,如果下面的方法调用工作正常,并调用士兵方法walk sp.walk(); 为什么编译器会抱怨此调用的错误 sp.xyz(); 你可能想看看这个 基本上,xyz方法是在Person的子类中定义的,在一般情况下,编译器不知道(也不应该知道)引用的实例是Soldier还是其他未定义xyz方法的子类。在Java中是“对象”不是价值本身——它们必须始终
sp.walk();
为什么编译器会抱怨此调用的错误
sp.xyz();
你可能想看看这个 基本上,
xyz
方法是在Person
的子类中定义的,在一般情况下,编译器不知道(也不应该知道)引用的实例是Soldier
还是其他未定义xyz
方法的子类。在Java中是“对象”不是价值本身——它们必须始终通过引用进行操纵;当你创建一个对象时,你会得到一个引用;当您访问一个字段或调用一个方法时,您可以通过引用来执行。当您将一个引用指定给另一个引用时,它会复制该引用,因此您有多个指向同一对象的指针
您的问题是,当
Soldier
对象存储在Person
引用中。答案是
“多态性”和“静态类型”的交叉点。因为Java是
在编译时使用静态类型,可以从
但您必须遵守exchange或代码中的规则
不会编译。在这里,相关的保证是
子类(例如,Soldier
)可以用作其超级类的实例
类别(例如,人员
)
请看一看这个,它有更详细的解释
在教程指南中,要真正理解继承,请在编译时父类引用“sp”中查看该方法。如果您想以((士兵)sp.xyz()的身份访问,这是明确的。 由于对对象(sp)的引用是Person类型,这意味着sp仅包含Person的所有属性和方法。 即使您得到了士兵的实例,但您的引用仍然来自人员类型。
是一个类Person
是一个对象,它是sp
Person
- 类
没有名为Person
的方法,因此强制xyz()
不工作sp.xyz()
(您有输入错误,我们使用
@Override
,而不是@Override
)在编译时,IDE只知道静态对象类型是Person类。您可以在这里看到编译时引用规则:谢谢,这解释了很多。那么究竟什么时候调用了Soldier.walk()?因为它似乎在编译时调用了Person.walk()。士兵的实例被转换为Person的实例,这就是为什么调用士兵的walk()
方法的原因。因此它仍然是Soldier的实例,但只有Persons方法是可访问的,因为sp
保证是Person类型,而不是Soldier,因为这也是有效的codePerson sp=new Person()代码>
sp.xyz();