【发布时间】:2011-07-19 14:49:15
【问题描述】:
为什么interface 定义中的所有方法都隐含public?为什么它不允许protected 方法?
【问题讨论】:
-
非常好的问题。对于 Java 中的几乎所有其他事情,我都找到了做出选择的真正原因,但对于这个我没有。对我来说,在接口中定义一个受保护的方法是非常有意义的,它允许同一个包中的另一个类在实现对象上使用该方法,而无需公开该方法,除了打包成员,发往世界其他地方。
-
@MarkusA。但是接口可以双向工作,即它们也可以由当前包之外的类实现(然后可能作为参数传递给该包内的方法)。当前包之外的类如何能够实现某些公共接口的“受保护”方法?
-
@MartinStettner:不会。这就是重点。一个包可能有多个实现一个接口的不相关类,并希望保证任何接收该接口类型引用的代码都会以某种方式运行。如果可以防止外部代码声称实现接口,同时以违背其合同的方式行事,则这种保证可以变得更加强大。
-
@MarkusA。你提出了一个很好的观点,你应该可以通过Java 9's module system实现它
-
如果接口有
protected方法,所有实现类都将被视为接口的子类型。并且所有这些类都可以访问受保护的方法。它不会使方法上的protected关键字无用吗?只要我们没有任何方法来限制谁实现了这个接口,方法上受保护的关键字是没有用的。如果我错了,请纠正我!