protected
主要用于效用和辅助方法一类的内部。它们并不意味着可以从外部访问,如private
方法。
然而,延伸类可能需要访问这些方法或甚至修改它们。所以基本上它是就像private
,其存在的权利应该是明确的,但是你想让扩展类有机会也可以访问它。
这种情况经常发生,他们决定在该语言中包含protected
。如果您有其他愿望或设计建议,请随时分享。
这里是经常引用overview table:
| Class | Package | Subclass | Subclass | World
| | |(same pkg)|(diff pkg)|
————————————+———————+—————————+——————————+——————————+————————
public | + | + | + | + | +
————————————+———————+—————————+——————————+——————————+————————
protected | + | + | + | + |
————————————+———————+—————————+——————————+——————————+————————
no modifier | + | + | + | |
————————————+———————+—————————+——————————+——————————+————————
private | + | | | |
+ : accessible
blank : not accessible
想想,你提供一些abstract
基类,像AbstractMap
的例子。它可以有一种重新安排内部事物的方法。
您可以制作方法private
,但您也可以制作protected
,因为扩展类可以通过覆盖来更改重新排列过程。如果扩展类由于其特定的结构,可以使用额外的知识来创建更高效的方法,这可能会很有用。
什么是错误信息? –
为什么你认为它*应该*编译? –
OP不认为它应该编译。他也没有要求程序不编译的原因。 OP想知道Java中这种设计选择的原因。 – Zabuza