我正在尝试运行Java程序来实现覆盖grow
方法的方法。
如果使用默认访问修饰符声明了类grow
(父类)中的方法Tree
并打印了"Oak is growing"
,则覆盖效果很好。
但是,当其更改为private
时,将执行父类(Tree
)中的方法。
// Code with grow() default modifier
public abstract class TreeGrow {
void grow() {
System.out.println("Tree is growing");
}
public static void main(String args[]) {
TreeGrow tree = new Oak();
tree.grow();
}
}
class Oak extends TreeGrow {
protected void grow() {
System.out.println("Oak is Growing");
}
}
// Code with private grow
public abstract class TreeGrow {
private void grow() {
System.out.println("Tree is growing");
}
public static void main(String args[]) {
TreeGrow tree = new Oak();
tree.grow();
}
}
class Oak extends TreeGrow {
protected void grow() {
System.out.println("Oak is Growing");
}
}
为什么通过Oak对象调用Tree
类中的私有方法?
答案 0 :(得分:0)
问题是您的对象的类型为TreeGrow
。因此,您的main方法调用方法TreeGrow.grow()
。私有方法不会被覆盖,因此将调用“最合适的”方法,即private void grow()
。
您需要将对象转换为相应的类型才能使用其方法。尝试使用((Oak)tree).grow
(或使用Oak tree = new Oak();
)。这应该执行您的方法。
编辑: 对不起,“模糊”的解释。我很着急,想尽快提供帮助。重新访问后,它确实写得不好。由于链接的“重复”问题(以及相应的答案)以更详尽的方式描述了所有内容,因此我建议您在此处阅读。