覆盖变化的可见性

时间:2018-06-02 07:49:37

标签: java

在下面的程序中,如果A中的msg()声明为public,则main()中的b.display()调用B&#39的msg()版本。但是,如果A中的msg()声明为private,则main()中的b.display()调用A的msg()版本。你能告诉我为什么会这样吗?

提前致谢。

class A {
    private String msg() {
        return "Message from class A";
    }

    void display() {
        System.out.println(msg());
    }
}

class B extends A {
    public String msg() {
        return "Message from class B's msg()";
    }
}

class Tests {
    public static void main(String args[]) {
        B b = new B();

        // private version of msg defined in A will be called
        // if msg is defined as public in A, the version of msg defined in B is called
        b.display();

        // the version defined in B is called
        System.out.println(b.msg());
    }
}

3 个答案:

答案 0 :(得分:1)

因为A的方法

private String msg() {
        return "Message from class A";
    }

是私人的。要覆盖它,它必须是公共的,在B上应该有@Override符号,如此

class B extends A {
    @Override
    public String msg() {
        return "Message from class B's msg()";
    }
}

答案 1 :(得分:0)

简而言之,这是因为你不能覆盖私有方法--Java不允许它。

您可以将所有私有方法视为使用final修饰符进行有效标记。

如果要确保方法已明确覆盖另一个方法,请使用@Override注释。通过在编译时抛出错误,这将让你知道它是否没有。

答案 2 :(得分:0)

因为在java中,扩展类只有可能的upconversion修饰符,而不是其他。对于代码Class A have method private msg()中的expamle,扩展类make private msg() to public msg , msg() , and protected msg(); 在您的情况下,您创建B b = new B()并自然地调用b.display()调用超级方法(因为您没有可能覆盖私有方法' s),而不是扩展。 b.msg()来自b,因为你压倒了它。