与C ++相比Java中的访问修饰符

空想家

我已经在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C#中的访问修饰符

来自分类Dev

访问修饰符C#

来自分类Dev

C#内部访问修饰符

来自分类Dev

来自 C++ 的静态修饰符,但在 Java 中?

来自分类Dev

C#中的幂等修饰符

来自分类Dev

在接口C#8中使用静态,内部和受保护的访问修饰符

来自分类Dev

如何在C中为结构实现受保护的访问修饰符

来自分类Dev

在Visual C ++中,访问修饰符“受保护的私有”有什么作用?

来自分类Dev

C#中类和变量的默认访问修饰符?

来自分类Dev

访问修饰符是C#中“方法签名”的一部分吗?

来自分类Dev

访问级别修饰符与C#中的程序集负载

来自分类Dev

在 C# 中限制表单类属性的访问修饰符

来自分类Dev

C ++ 11继承构造函数和访问修饰符

来自分类Dev

Java中c#通用修饰符“ out”的替代方法

来自分类Dev

Java中c#通用修饰符“ out”的替代方法

来自分类Dev

Objective-c中的const修饰符

来自分类Dev

Objective-C中的静态修饰符

来自分类Dev

有什么与访问修饰符等效的东西,该修饰符可以限制使用C#只能访问一个线程?

来自分类Dev

PHP Regex未知修饰符“ C”

来自分类Dev

C#访问修饰符,仅在命名空间中公开类

来自分类Dev

System.Reflection.BindingFlags.Instance与C#访问修饰符的对应关系

来自分类Dev

C#:使用getter / setter shortand时,可以混合使用函数访问修饰符吗?

来自分类Dev

将访问修饰符设置为 C++ #define CONSTANT_NAME constant_value

来自分类Dev

c#如何在RegExp中编写点修饰符?

来自分类Dev

使用C中的宏删除(或有条件地附加)const修饰符

来自分类Dev

java访问修饰符互相淘汰?

来自分类Dev

C#的C ++表示形式?CLR上的修饰符

来自分类Dev

C#的C ++表示形式?CLR上的修饰符

来自分类Dev

定义一个ostream修饰符c ++

Related 相关文章

  1. 1

    C#中的访问修饰符

  2. 2

    访问修饰符C#

  3. 3

    C#内部访问修饰符

  4. 4

    来自 C++ 的静态修饰符,但在 Java 中?

  5. 5

    C#中的幂等修饰符

  6. 6

    在接口C#8中使用静态,内部和受保护的访问修饰符

  7. 7

    如何在C中为结构实现受保护的访问修饰符

  8. 8

    在Visual C ++中,访问修饰符“受保护的私有”有什么作用?

  9. 9

    C#中类和变量的默认访问修饰符?

  10. 10

    访问修饰符是C#中“方法签名”的一部分吗?

  11. 11

    访问级别修饰符与C#中的程序集负载

  12. 12

    在 C# 中限制表单类属性的访问修饰符

  13. 13

    C ++ 11继承构造函数和访问修饰符

  14. 14

    Java中c#通用修饰符“ out”的替代方法

  15. 15

    Java中c#通用修饰符“ out”的替代方法

  16. 16

    Objective-c中的const修饰符

  17. 17

    Objective-C中的静态修饰符

  18. 18

    有什么与访问修饰符等效的东西,该修饰符可以限制使用C#只能访问一个线程?

  19. 19

    PHP Regex未知修饰符“ C”

  20. 20

    C#访问修饰符,仅在命名空间中公开类

  21. 21

    System.Reflection.BindingFlags.Instance与C#访问修饰符的对应关系

  22. 22

    C#:使用getter / setter shortand时,可以混合使用函数访问修饰符吗?

  23. 23

    将访问修饰符设置为 C++ #define CONSTANT_NAME constant_value

  24. 24

    c#如何在RegExp中编写点修饰符?

  25. 25

    使用C中的宏删除(或有条件地附加)const修饰符

  26. 26

    java访问修饰符互相淘汰?

  27. 27

    C#的C ++表示形式?CLR上的修饰符

  28. 28

    C#的C ++表示形式?CLR上的修饰符

  29. 29

    定义一个ostream修饰符c ++

热门标签

归档