当我使用protected
方法覆盖public
方法时,Java编译器不会抱怨。这里到底发生了什么?它是否覆盖或隐藏父方法,因为父方法的可见性较低?
答案 0 :(得分:32)
子类总是可以加宽访问修饰符,因为它仍然是超类的有效替换。来自Java规范Requirements in Overriding and Hiding:
覆盖或隐藏方法的访问修饰符(第6.6节)必须至少提供与重写或隐藏方法一样多的访问权限,如下所示:
- 如果被覆盖或隐藏的方法是公开的,那么覆盖或隐藏方法必须是公开的;否则,发生编译时错误。
- 如果被覆盖或隐藏的方法受到保护,则必须保护或隐藏覆盖或隐藏方法;否则,发生编译时错误。
- 如果被覆盖或隐藏的方法具有默认(包)访问权限,则覆盖或隐藏方法不得为私有方法;否则,发生编译时错误。
答案 1 :(得分:2)
从外部类的角度来看,public方法只是一种新方法,而不是一种重写方法,因为外部类无论如何都无法访问受保护的方法。
另一方面,不允许降低可见性,因为外部类总是可以使用超类类型的引用来引用子类的对象并调用相同的方法。
答案 2 :(得分:0)
可见性仅影响外部可访问性。作为public
方法,任何外部类都可以调用它。
覆盖方法的访问级别不会影响原始方法的可见性。在覆盖之后,使用任何访问级别,只能通过调用子类中的super
来访问原始方法。