我已经在StackOverflow中看到了有关此主题的一些讨论,但没有发现任何有助于我理解以下几点的内容:
我来自C ++背景,最近我开始学习Java。在C ++中,当使用protected时,只有一个子类可以访问该成员(Java中Field的类似物)。
在C ++中,还有“朋友”类,可以访问提供“友谊”的类的私有/受保护成员。这有点类似于Java中的“包”字段修饰符(默认字段修饰符),除了在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中的“包”字段修饰符(默认字段修饰符),除了在C ++中,友谊允许访问所有私有成员,但是在Java中,来自同一包中类的访问特定于类字段。
不仅有friend
类而且有函数。
的确,Java的程序包私有访问是类似的,但它不是完整的替代。更好的表达方式是,这两个功能解决了一部分问题。有些问题可以通过friend
但不能通过package-private解决,反之亦然。
我不明白的是,假设我只想授予子类访问权限,这是我可以在C ++中通过声明一个不会“赋予”友谊的类中受保护的成员来完成的工作。
但是在Java中,我不知道该怎么做,
答案是:您不能。
因为通过使用“ protected”字段修饰符-我还可以访问包中的所有类。
确切地。
我发现这样做的唯一方法是声明受保护的字段,并在其包中隔离该类。
从技术上讲,是的。但这带来了其他问题。您的课程将不再能够访问其先前程序包的程序包私有元素。假设您BaseClass
曾经在com.example.one
。您将其移至com.example.two
。现在,它将不再能够访问的其他程序包专用类com.example.one
。
这确实是包裹分组中的主要考虑因素吗?
是的,Java就是这样设计的。您可以尝试违反语言规则,但这在任何编程语言中都是一场失败的战斗。
我不明白的另一件事是,在Java中,假设我在类A中有两个字段:b,c。我想让B访问b但不访问c,我想让C访问c但不访问b。并希望将“ b,c”隐藏在“世界”中。怎么做到呢?
它不能以一种干净的方式来完成(干净的意思是:没有任何需要您在运行时检查调用堆栈并抛出异常的hack)。
如果由于正在设计一个公共API而对这种情况感到担心,那么通常效果最佳的低技术解决方案是创建一个或多个*.internal
程序包,并明确记录不应该在客户端代码中使用的事实。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句