Day*_*mer 5 java access-modifiers
我在StackOverflow中看到了关于这个主题的一些讨论,但我没有看到一些帮助我理解以下内容的东西:
我来自C++背景,最近我开始学习Java.在C++中,当使用protected时,只有子类可以访问该成员(类似于Java中的Field).
在C++中,还有"朋友"类可以访问提供"友谊"的类的私有/受保护的成员.这有点类似于Java中的"package"字段修饰符(默认字段修饰符),除了在C++中友谊提供对所有私有成员的访问,但在Java中,来自同一包中的类的访问特定于类字段.
我无法理解的是,假设我只想访问子类,我可以在C++中通过声明受保护的成员不会"给予"友谊来实现这一点.
但是在Java中,我不知道怎么做,因为通过使用"protected"字段修饰符 - 我还可以访问包中的所有类.我发现这样做的唯一方法是声明受保护的字段并将类隔离在其包中.
从这里,我得出的结论是,一个包中的类的分组必须基于类之间的"友谊"来完成. 这确实是包装分组中的主要考虑因素吗?
另一件我不明白的事情,在Java中,假设我在A类中有两个字段:b,c.我想给b访问b而不是c,我想给c访问c而不是b.而对于"世界"我想要b,c被隐藏.怎么做到呢?我猜B,C应该和A在同一个包中.但是通过使用包修饰符声明b,c 我让B,C访问b和c. Java中有没有办法做到这一点?
希望对这个问题有一些解释
在 C++ 中,当使用 protected 时,只有子类可以访问该成员(类似于 Java 中的 Field)。
访问说明符也适用于成员函数/方法,而不仅仅是成员变量/字段。
在 C++ 中,还有“朋友”类,可以访问提供“友谊”的类的私有/受保护成员。这有点类似于 Java 中的“package”字段修饰符(默认字段修饰符),只不过在 C++ 中,友谊可以访问所有私有成员,但在 Java 中,来自同一包中的类的访问是特定于类字段的。
不仅有friend类,还有函数。
确实,Java 的包私有访问是类似的,但它并不是完全替代。更好的说法是,这两个功能具有它们解决的问题的子集。有些问题可以通过friendpackage-private 解决,但不能通过 package-private 解决,反之亦然。
我无法理解的是,假设我只想授予子类访问权限,那么我可以在 C++ 中通过声明在不“提供”友谊的类中受保护的成员来做到这一点。
但在Java中,我不知道该怎么做,
答案是:你不能。
因为通过使用“受保护”字段修饰符 - 我还可以访问包中的所有类。
确切地。
我发现做到这一点的唯一方法是声明该字段受保护并将该类隔离在其包中。
从技术上来说,是的。但这会产生其他问题。您的类将不再能够访问其先前包的包私有元素。假设你BaseClass以前在com.example.one. 你把它移到com.example.two. 现在它将不再能够访问com.example.one.
这确实是包分组的主要考虑因素吗?
是的,Java就是这样设计的。您可以尝试与语言规则作斗争,但对于任何编程语言来说,这都是一场失败的战斗。
另一件事我不明白,在Java中,假设我在类A中有两个字段:b,c。我想授予 B 访问 b 的权限,但不授予 c 的访问权限;我想授予 C 访问 c 的权限,但不授予 b 的访问权限。对于“世界”,我希望 b,c 被隐藏。如何做呢?
它不能以干净的方式完成(我所说的干净是指:没有任何需要您在运行时检查调用堆栈并抛出异常的黑客)。
如果您因为正在设计公共 API 而担心这种情况,那么通常完美的低技术解决方案是创建一个或多个*.internal包,并清楚地记录这些包不应在客户端代码中使用的事实。
| 归档时间: |
|
| 查看次数: |
1721 次 |
| 最近记录: |