为什么Java中不允许使用较弱的重写函数?

ipk*_*iss 0 java access-modifiers

我有以下代码:

public class Library {

    public void myFunction() {
        // do something
    }
}
public class Book extends Library{

    protected void myFunction() { // Error here
        // do something
    }

}
Run Code Online (Sandbox Code Playgroud)

上面的代码有错误,因为Book类试图用较弱的访问修饰符覆盖supper类的函数.我知道这是Java的规则.但我很好奇为什么会这样?它可能导致什么问题?

小智 5

从一个完全不同的包中考虑:

new Book().myFunction()             // clearly, no access

((Library)new Book()).myFunction()  // now ... access?
Run Code Online (Sandbox Code Playgroud)

这个问题真的可以归结为myFunction虚拟的 ; 调用的方法取决于运行时类型而不是表达式的静态类型.(我相信C#实际上允许使用new修饰符的非虚方法.)