【发布时间】:2018-12-27 04:57:25
【问题描述】:
无法使用以下行从子类访问方法,
Parent p = new Child(); p.print();
假设我在 Child 类中有一个方法 print(),并且在 Parent 类中 NOT 有相同的方法。在这种情况下,我们无法使用上面的代码行访问子类方法print()。但请注意,如果我们在父类中有相同的方法print(),那么我们可以使用上面的代码访问它。
现实生活中可能没有这样的场景,但如果我们没有在父类中定义相同的方法,我试图理解为什么我无法使用 Parent 类型的子对象访问子类print()。
示例代码如下:
public class Main {
public static void main(String[] args)
{
Parent p = new Child();
p.print(); //Compiler throws an error saying "cannot resolve print method".
}
}
class Parent {
int x = 10;
}
class Child extends Parent {
void print(){
System.out.println("Child");
}
int x = 20;
}
更多解释 - 如果我在父类中定义 print() 方法,那么我可以使用 Parent 类型的对象访问子类 print() 方法。所以我假设我们不能说 parent 类型的对象只能访问父类中定义的成员/方法。
另外,我知道我们可以通过将父类型转换为子类型来访问子方法。我想知道为什么我们不能在没有强制转换的情况下访问子类方法,如果我们没有在父类中定义相同的方法。
我已编辑问题以确保这与其他问题无关 - Calling a subclass method from superclass
【问题讨论】:
-
其实很简单:
Parent没有名为print的方法。您声明p是父母。编译器看到了,去寻找它的print方法并且......没有-> 错误。如果你在Parent中声明它,现在它会被发现,并且在运行时中像往常一样调用Child类中的覆盖方法... -
另一种选择是将对象转换为实际的孩子。子子 = (子)p; -> 这应该使该方法也可以访问。
-
@MalteHartwig not a duplicate bcz 您提到的是找到一种在引用具有 Parent 类型时调用子方法的方法,并且我们可以使用类型转换来实现。但在我的问题中是不同的。请仔细阅读问题。
-
据我所知,您的问题仍然与您链接的问题重复。仅仅否定您的问题并不会使其他答案无用;它仍然应该解释为什么你不能在不强制转换或拉起方法的情况下访问孩子的方法。此外,本的评论是一个很好的总结。您可以在 Parent 类型中强制转换或定义(抽象)方法。否则,不,您无法访问它。
-
“如果我在父类中定义 print() 方法,那么我可以使用 Parent 类型的对象访问子类的 print() 方法。”不,你不能。您对引用与对象感到困惑。 Parent 对象甚至不知道任何 Child 类,但是当您在 Parent reference 上调用方法时,它将调用父版本或子版本,具体取决于实际对象以及 Child 对象是否已覆盖该方法。
标签: java