(Java)如何调用重写的;继承的;来自超类的方法?
让我们直接转到代码: Father.java: Son.java: Main.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
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