在Java中,具有"受保护"修饰符的成员不仅可以由同一个类和子类访问,还可以由同一个包中的每个人访问?

我想知道语言设计的原因,而不是实际的应用程序(例如,测试)

+1坦率地说我也想知道为什么。 它总是让我感到震惊,因为它是Java中最愚蠢的设计决策之一。

@cletus:我想的时间越长,我就得出结论"包私"是一个没有深思熟虑的想法。 对于"封装私有"到实际工作并提供任何类型的实际保护,需要在单个编译单元内编译包。 人们不应该在以后加强它们。

修饰符在http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html中有详细描述。从那里我们看到这个数字。

Modifier        Class     Package Subclass  World

public          Y         Y         Y         Y

protected       Y         Y         Y         N

no modifier     Y         Y         N         N

private         Y         N         N         N

由此可见设计决策的原因很明显:它有一个很好的对称矩阵。

无论如何它会是对称的......

谢谢你这张桌子。

@迈克尔·迈尔斯:嗯,不,不管怎样它都不会对称。它的对称性是有原因的。

如果在protected - >包交叉处放置N而不是Y,则它仍然是对称的。只是不那么漂亮。

@MichaelMyers:我不认为Matrix是对称的。但目前的情况是:所有Y在对角线之上(和之上)以及所有N在下方。

这种设计基于这样的想法:包装是适当的单元,由一个内部一致的团队维护和发布;继承关系与谁维护和释放什么时候关系不大。

感谢您的回答。当然实际上并没有起作用,因为没有人阻止你在几个罐子上分发一个包装 - 并且在几个团队中使用它。所以这是另一个没有充分考虑的好主意。 Java充满了一些东西。

在Java 1.0中,有第五个访问修饰符:private protected。这是protected没有默认访问权限。显然它从来没有真正正常工作,并在1.1中被删除。因此看起来声称protected被定义为总排序的方式似乎是虚假的。 (编辑:看来,在1.1中删除第五个访问修饰符的原因中至少有一个原因是缺少总排序干扰了重载选择规则。)Java 7中的module访问修饰符有一些设计问题在这方面。

鉴于认为成员的默认访问修饰符为"包私有"是个好主意,protected应该至少具有这种访问级别似乎是合理的。对于我的钱,protected根本不会用语言付费。

我从来没有听说过那个,但我在1.1中进入Java ...谢谢!

并且由于没有人阻止您在不同的jar文件中向包中添加更多类,因此"package private"也不是那么私有。原样:除了私人和公共之外的任何东西或多或少都是对程序员的暗示,但没有真正的保护。

一个非常晚的问题,但你有一个来源吗?我现在想更详细地了解当时失败的原因和原因。

@PieterDeBie那是来自记忆。 22年前,我将我正在进行的内部项目从1.0升级到1.1。 bugs.sun.com只给我"私有保护"被删除以简化规范的其他部分 - 例如,有关覆盖的规则要求访问保护是可比较的(即严格地比较弱或强。)

@Martin你可以在清单中将罐子标记为"密封",这可以防止任何添加。当然可以修改jar本身 - 包括类文件。除非您对jar进行签名,否则您无法将任何类添加到具有不同签名的相同运行时包中(假设签名已经过验证)。此外,来自不同类加载器的任何类都将位于不同的运行时包中。

基本上它与包作为api控制单元的视图有关(因此建议使用您的域名启动您的包 - 保证全局唯一性),因此可见性从私有 - > package-private - > protected - > public 。如果受保护不是增加包私有,而是增加不同类型的可见性,则必须有某种方法在需要时组合两种类型的可见性。

但是没有人阻止你在已经退出的包中添加新类。因此,"私有包"和"受保护"只是对程序员的推荐。两者都没有为想要/需要调用该方法的恶意/绝望程序员提供任何真正的保护。 - 像C ++中的"protected"至少会强制使用子类 - 但在Java中你甚至不需要这样做。

鉴于渐进级别的访问,私有,包,受保护和公共,如果它受到保护然后打包将会不必要地限制,因为这将迫使我允许子类访问以便授予同一包的其他成员。然而,直观地说,应该是同一个包中的其他类比"那里"的其他类更值得信赖。所以在包和公共之间受到保护,因为它允许更广泛的访问。

我认为基本原因依赖于直觉,即同一个包中的类之间存在基本的"信任"级别;你可以合理地期望他们彼此做正确的事 - 在大多数情况下,包将由一个工程师或团队负责,所以应该有一致的设计和谐。

这就是理论。但是在实践中,只有当一个包需要在一个编译单元中编译而无法在外部增强时才会出现这种情况。但情况并非如此,因此,在一个苗条的代表类的帮助下,任何"包私有"方法都可以公之于众。对程序员的暗示,但不是真正的保护。

@martin:只有在没有密封的情况下发布包,才能解决这个特殊问题。

"密封包装" - 从来没有听说过,但听起来很有趣。告诉我更多! (几句话帮我google细节就够了)

我自己找到了:docs.oracle.com/javase/tutorial/deployment/jar/sealman.html - 非常有趣。应该默认;-)。

Java确实遵循其设计原则。当您尝试减少/缩小子类中公共方法的范围时会发生什么?一个人得到一个错误。

Java范围修饰符级别如下:private

包中的所有类都应该是友好的,因为它们一起工作。要使成员在包中可用,它将在默认范围内定义。

子类可以驻留在包外部,再次遵循范围级别:private

请不要将修饰符限制为仅可见性,但继承,结构也同时工作并将它们添加到图片中。如果是这样的话:private

同包类 和 其他类 java_关于继承:为什么Java中的“protected”修饰符允许访问同一个包中的其他类?...相关推荐

  1. Java类中的权限修饰符

    为什么80%的码农都做不了架构师?>>>    public:允许所有外部类访问使用public protected:允许子类和同包类访问使用protected private:只能 ...

  2. java域的控制修饰符可分为_Java中的类和方法的修饰符

    java 中的类和方法的修饰符Java程序在定义类时,除了使用class关键字标识之外,还可以在class之前增加若干类的修饰符来修饰限定所定义的类的特性.类的修饰符分为访问控制符和非访问控制符两大类 ...

  3. Java学习笔记10---访问权限修饰符如何控制成员变量、成员方法及类的访问范围...

    1.Java有三种访问权限修饰符,分别为public.protected.private,还有一种为缺省权限修饰符的情况,记为default.其中,可以由public和default来修饰类:这四种修 ...

  4. gnu java_【Java学习笔记】修饰符

    1.修饰顶层类(不是指在一个类中定义的类)包括abstract.public.final.局部变量只能用final修饰. 2.一个类中,可以访问类本身或内部类的实例的私有成员. 3.abstract修 ...

  5. java平台类成员访问修饰符_JAVA类的修饰符及访问权限

    1.类 外部类      class前的修饰符只能有public final abstrct 无(默认) :同包可见  (Eclipse中选择package) 内部类      class前的修饰符有 ...

  6. java方法和变量修饰符有哪些_死磕Java基础---类,变量和方法的修饰符

    欢迎关注微信公众号:一个自学的程序员 类修饰符 对于类的修饰符,毫无疑问是用来修饰类的,那么,修饰类的修饰符都有哪些? 有如下这些: 1. abstract 2. final 3. private 4 ...

  7. 访问修饰符、常见的包以及包的权限和包的导入(inport关键字)、继承(super关键字)、多态(向上和向下转型)

    IDEA中快捷生成getter/setter的快捷键为 alt+inser(enter) getter/setter命名规范:都是以gte/set单词开头+要操作的属性名称 一.访问修饰符 Java中 ...

  8. 静态对象线程java_慢速多线程Java应用程序:这是由于访问静态对象引起的吗?...

    首先,介绍- 我有一组类,它们从同一类Feature继承,但是彼此不同,因为它们每个都使用不同的信息进行计算.所以这是一个例子: public class FeatureA extends Featu ...

  9. SSM框架中mapper和mapping.xml文件在同一个包下需要的配置

    前言 当我们在开发过程中,由于maven项目本身的限制,我们不能直接把我们的mapper.xml文件和对应mapper.java接口文件放到一起,也就是不能直接放在java包中,如图: 因为maven ...

最新文章

  1. 调试 后台 ajax post 对应的php的方法
  2. 差点败北!B站疯传3W次,堪称最强Java面试题,顺利拿下阿里P7的35K*16 薪 Offer...
  3. 云+社区小程序知识周,等你来挑战!
  4. fmincon函数求解过程中出现无解的情况
  5. WinMerge软件的使用
  6. NYOJ 745 dp
  7. LeetCode(1021)——删除最外层的括号(JavaScript)
  8. java 镶嵌创建线程_请教一个 Java 多线程嵌套使用的问题
  9. Android网易歌词json接口,网易云音乐api分析
  10. 如何简单运行Java程序
  11. css select pyquery的简单爬取
  12. GOP和帧率、码率的关系
  13. 手机开热点免流教程(ROOT版)
  14. Zabbix6.2这些新特性太棒了,手把书教你在Linux部署Zabbix6.2,速度收藏!
  15. Gluster的配置及离线安装
  16. shell 脚本实战 三
  17. python 文字转语音 带情感_Python文字转换语音,让你的文字会「说话」抠脚大汉秒变撒娇萌妹...
  18. 用JAVA生成GIF动画
  19. Dubbo/Dubbox的服务暴露(一)
  20. Linux HID分析

热门文章

  1. mysql 8 修改root密码忘记_忘记mysql8或者mariadb5及以上 的root密码如何更改
  2. 线条边框简笔画图片大全_超治愈萌系手帐素材大全 美食旅游花草人物花边都备齐了...
  3. python可以实现哪些功能_Python中实现机器学习功能的四种方法介绍
  4. Halcon学习笔记:Halcon标定步骤-3d_coordinates.hdev示例
  5. MySQL中使用外键约束的注意事项
  6. 在 windows 下使用 Xming+Putty 显示 Linux 下软件图形界面
  7. Swagger 注解~用于方法
  8. HTML 显示特殊字符时转义操作
  9. mysql 5.7安装完密码是多少_关于mysql5.7.18的安装并修改初始密码的图文教程
  10. oracle里的concat,oracle 中的 CONCAT,substring ,MINUS 用法