为什么私有修饰符尽管通过子类对象调用,却使程序在超类中执行私有方法?

时间:2019-07-04 10:05:44

标签: java

我正在尝试运行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类中的私有方法?

1 个答案:

答案 0 :(得分:0)

问题是您的对象的类型为TreeGrow。因此,您的main方法调用方法TreeGrow.grow()。私有方法不会被覆盖,因此将调用“最合适的”方法,即private void grow()

您需要将对象转换为相应的类型才能使用其方法。尝试使用((Oak)tree).grow(或使用Oak tree = new Oak();)。这应该执行您的方法。

编辑: 对不起,“模糊”的解释。我很着急,想尽快提供帮助。重新访问后,它确实写得不好。由于链接的“重复”问题(以及相应的答案)以更详尽的方式描述了所有内容,因此我建议您在此处阅读。