由于子类可以访问受保护的成员,因此它们是否属于公共API的一部分?因此,它们是否具有与明确的公共成员相同的向后兼容性要求?
我想这个问题会变得更加复杂,例如private[foo]
(例如Scala)。随意回答这个问题。
是,是:受保护的成员是导出的(公共)API的一部分,并且具有相同的兼容性要求。
Java将访问修饰符作为其后继的众多JVM和非JVM语言的先驱;并且Effective Java对此问题具有权威性声明。
来自第15项:最小化类和成员的可访问性,
...私有成员和包私有成员都是类实现的一部分,通常不会影响其导出的API。
对于公共类的成员,当访问级别从包私有变为受保护时,可访问性将大大增加。受保护的成员是该类导出的API的一部分,必须得到永久的支持。同样,导出类的受保护成员表示对实施细节的公开承诺。对受保护成员的需求应该相对较少。