为什么可以使用公共方法重写受保护的方法?

2022-09-01 20:34:24

当我用方法覆盖方法时,Java编译器不会抱怨。这里到底发生了什么?是重写还是隐藏父方法,因为父方法的可见性较低?protectedpublic


答案 1

子类始终可以加宽访问修饰符,因为它仍然是超类的有效替代项。从 Java 规范中关于重写和隐藏中的需求:

重写或隐藏方法的访问修饰符 (§6.6) 必须至少提供与重写或隐藏方法一样多的访问权限,如下所示:

  • 如果被覆盖或隐藏的方法是公共的,则重写或隐藏的方法必须是公共的;否则,将发生编译时错误。
  • 如果被覆盖或隐藏的方法受到保护,则覆盖或隐藏方法必须受到保护或公开;否则,将发生编译时错误。
  • 如果重写或隐藏的方法具有默认(包)访问权限,则重写或隐藏方法不得为私有方法;否则,将发生编译时错误。

答案 2

从外部类的角度来看,公共方法只是一个新方法,而不是重写方法,因为外部类无论如何都无法访问受保护的方法。

另一方面,不允许降低可见性,因为外部类始终可以使用超类类型的引用来引用子类的对象并调用相同的方法。