Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么可以';我是否使用引用子类型实例的父类型引用调用子类方法?_Java_Inheritance - Fatal编程技术网

Java 为什么可以';我是否使用引用子类型实例的父类型引用调用子类方法?

Java 为什么可以';我是否使用引用子类型实例的父类型引用调用子类方法?,java,inheritance,Java,Inheritance,我正在学习Java,同时试图理解继承。我不明白为什么子类walk()中被重写的方法被执行,而另一个xyz()方法没有执行 我的问题是,如果下面的方法调用工作正常,并调用士兵方法walk sp.walk(); 为什么编译器会抱怨此调用的错误 sp.xyz(); 你可能想看看这个 基本上,xyz方法是在Person的子类中定义的,在一般情况下,编译器不知道(也不应该知道)引用的实例是Soldier还是其他未定义xyz方法的子类。在Java中是“对象”不是价值本身——它们必须始终

我正在学习Java,同时试图理解继承。我不明白为什么子类walk()中被重写的方法被执行,而另一个xyz()方法没有执行

我的问题是,如果下面的方法调用工作正常,并调用士兵方法walk

    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,因为这也是有效的code
Person sp=new Person()
    sp.xyz();