java 的接口中方法_关于java:接口中的方法可见性

在默认情况下,接口中的所有方法都具有公共可见性模式吗?

如果你有时间,你可能想阅读首个团队的Java 6 PrIP指南的SCJP。那里有很多信息。默认情况下,接口方法是抽象的和公共的。

接口中的所有方法都默认为public。

参见Java语言规范

All members of interfaces are

implicitly public.

它们是public默认值,只有public是允许的值。

+1用于引用JLS(通常有引文)

但是Rodion(本地/私有接口本身)的答案/"解决方法"很重要:stackoverflow.com/a/5420362/1915920

所有接口方法都是public abstract,所有接口字段都是public static final…

请看这里。

+1:所有嵌套类都是public static。

最好不要在接口中有任何状态(实例变量),尽管编译器允许您定义字段。接口应该定义功能,或者对象可以做什么。

在此添加其他答案:所有方法都是公共的,但是,如果接口本身是包本地的,那么实际上所有方法也都是包本地的。

因此,通过使包本地接口扩展公共方法,可以混合公共方法和包本地方法。

public interface P{

void iAmPublic();

}

interface L extends P{

void iAmPackageLocal();

}

在这里,L有效地具有一种公共和一种包本地方法。来自包外部的客户机将只看到iAmPublic(),而来自包内部的客户机将看到这两种方法。

同样,您可以在其他类中嵌套接口,以实现更紧密的方法可见性。

您的方法iAmPackageLocal不是包私有的。见stackoverflow.com/a/4801672/16209

正如我在第一句中所说,方法是有效的package private(注意这里的单词是有效的),因为没有方法的声明接口,方法就不可能存在,而声明接口可以是package private,正如在同一篇文章中所述。由于您只能从包外部访问P#iAmPublic(),但可以从包内部访问这两种方法,因此您获得了所需的效果。假设您在包中有一个方法public L getL();的API,然后尝试从包外部调用getL().iAmPackageLocal(),您将得到一个编译器错误。

`公共类伪私有实现l

这可能与public class PseudoPrivate implements L一起泄漏。然后从包装外开始,这将起作用:new PseudoPrivate().iAmPackageLocal();。

您是对的,但我认为这是一个意见问题,因为是否公开实现类(在本例中是PseudoPrivate)是设计师的选择。如果要公开实现类,首先为什么要使用接口?正确的?因此,如果您坚持使用接口作为公共API,那么就我所见,这没有问题。

EDOCX1?10?

好吧,你把我带到那里了:)…我仍然经常使用这种技术,因为它很有用(只要您注意不要泄露可见性:)。很遗憾,Java没有更好的方法来实现这一点。

@但他没把你带到那儿,是吗?extends L示例仍然要求PseudoPrivate在同一个包中(以便L可访问),因此它与implements L一个包的问题相同(即,只有由设计师选择才会发生)。

@厄里格斯比先生想指出的是,我的想法只有在你有L extends P而不是P extends L的时候才有效,因为那样会泄露能见度。这是一个有效的观点。但如果您严格遵守代码中的L extends P,这个想法仍然有效。

@罗迪安,我不跟着你。您的基本设计是包访问接口L为伪包访问L方法扩展了公共接口P。PseudoPrivate implements L和PseudoPrivate extends L都有泄漏可见性,但都要求PseudoPrivate在同一个包中,因此这两个都只能作为包设计者的决定存在(如您所提到的),因此不会真正损害总体想法。

@Rodio可以在包外部使用包私有接口吗?也就是说,l myobj=new objthattimplementsl();除非它与l will在同一个包中,否则无法工作?如果是这样,那么如何既有一个公共方法又有一个包私有方法,因为接口L只能在同一个包中使用?

@先生,您可以争辩说,一个可能无意中泄露了可见性(另一个开发人员可能会忽略L的包访问可见性)。此外,可见性泄漏行为只发生在接口中,而不是类中,这强调了接口的设计并没有考虑到这种用法。它看起来更像是一个"意外的特性",所以应该小心使用它。

@Punchinginapper no,L不能在包装外使用。最初的想法是声明一个接口L,该接口只能从包内部看到和使用方法。下面是一个有用的例子:1)声明一个public interface X { P getP(); }2)声明一个public class C implements X { public L getP(); }。从包装外,您只能使用X x = ...; x.getP().iAmPublic();。从软件包内部,您可以选择执行C c = ...; c.getP().iAmPackageLocal()。

是的,接口中的所有方法都是隐式公共和抽象的。

检查Java语言规范第9.4章

是的,接口的所有方法都是公共的,不能有任何其他访问修饰符(即默认的公共访问修饰符是唯一有效的访问修饰符)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值