Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.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_Class_Methods_Overriding_Inherited - Fatal编程技术网

(Java)如何调用重写的;继承的;来自超类的方法?

(Java)如何调用重写的;继承的;来自超类的方法?,java,class,methods,overriding,inherited,Java,Class,Methods,Overriding,Inherited,让我们直接转到代码: Father.java: Son.java: Main.java: 因此,我想得到: Father Son 然而,我得到了: Father Father 我真的不太明白为什么(对于o1.DoSmth(o2))它从父类调用方法,因为o2是Son类型的。我能得到想要的答案吗 提前谢谢 注意:实际上,我想从父类内部调用(子类的)Print方法。可能吗?公共作废打印(子对象)不会覆盖公共作废打印(父对象)。它超载了 也就是说,DoSmth(父对象)在这两种情况下都在父实例上执行

让我们直接转到代码:

Father.java: Son.java: Main.java: 因此,我想得到:

Father
Son
然而,我得到了:

Father
Father
我真的不太明白为什么(对于o1.DoSmth(o2))它从父类调用方法,因为o2是Son类型的。我能得到想要的答案吗

提前谢谢

注意:实际上,我想从父类内部调用(子类的)Print方法。可能吗?

公共作废打印(子对象)
不会覆盖
公共作废打印(父对象)
。它超载了

也就是说,
DoSmth(父对象)
在这两种情况下都在
实例上执行,因此它将调用
类的
公共无效打印(父对象)
,即使
类重写了它

如果将
Son
类方法更改为:

@Override
public void Print(Father object) {
    System.out.println("Son");
}
并将
main
更改为:

public static void main(String[] args) {
    Father o1 = new Father();
    Son o2 = new Son();

    o1.DoSmth(o1);
    o2.DoSmth(o2);
}
您将获得输出

Father
Son

这是因为您正在父实例上调用Print方法。如果不将对象作为参数传递并调用object.Print(),您应该会得到预期的结果

您从
Father
调用该方法,就像您从
o1
实例调用它一样。@seelenVirtuse是的,这是一个错误,但不是唯一的错误。Eran的答案是正确的。不相关的:在java中,方法名是CAMELLCASE,而不是大写的,如C#。不遵循这样的惯例会使读者感到困惑。@SeelenVirtuse一件好事,在确定性输出方面,没有同意和不同意的概念。那些调用不会打印
Son
是的。我错了。无法通过
DoSmth
方法调用
Print(子对象)
方法。这个答案非常正确。是的,我没有读你写的所有东西就下定了决心。我的错。我得承认我的解释有点不对劲。现在修好了。我的回答好像是
object.Print(object)而不是
Print(对象)
@R.Thomes如果您想调用
Son
类的
Print
方法的
Parent
对象,也许您想从
DoSmth
调用
object.Print(object)
(在这种情况下,您可以删除
Print
方法的参数并调用
object.Print()
),我需要传递参数(不是在本例中,而是在实际情况中)。所以,如果我在“DoSmth”中写“object.Print(object)”,它确实有效!但前提是我在子类“public void Print(父对象)”中写入。如果我保留“public void Print(子对象)”,它将不起作用,我不明白为什么。你能帮我吗?
@Override
public void Print(Father object) {
    System.out.println("Son");
}
public static void main(String[] args) {
    Father o1 = new Father();
    Son o2 = new Son();

    o1.DoSmth(o1);
    o2.DoSmth(o2);
}
Father
Son