Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么要小心使用;“受保护”;_Java_Protected - Fatal编程技术网

Java 为什么要小心使用;“受保护”;

Java 为什么要小心使用;“受保护”;,java,protected,Java,Protected,在《核心JavaⅠ》一书中,它说 受保护的关键字应小心使用。如果您使用受保护的字段设置了一个类,那么,如果您想更改它,您必须通知使用该类的所有程序员 我不明白。如果子扩展父,并且父已更改,子未受影响。是这样吗 我不明白。如果子扩展父,并且父已更改,子未受影响。是这样吗 简单的回答是:不,一般情况下 假设您有两个在源代码版本1中描述的类: 版本1 现在,让我们更改父项的受保护字段asdf 版本2 现在还必须更改子类,因此它肯定会影响子类 图书馆 让我们考虑一个图书馆,我们假设你使用了很多。假设您从

在《核心JavaⅠ》一书中,它说

受保护的
关键字应小心使用。如果您使用
受保护的
字段设置了一个类,那么,如果您想更改它,您必须通知使用该类的所有程序员

我不明白。如果
子扩展父
,并且
已更改,
未受影响。是这样吗

我不明白。如果
子扩展父
,并且
已更改,
未受影响。是这样吗

简单的回答是:不,一般情况下

假设您有两个在源代码版本1中描述的类:

版本1 现在,让我们更改父项的受保护字段
asdf

版本2 现在还必须更改子类,因此它肯定会影响子类

图书馆 让我们考虑一个图书馆,我们假设你使用了很多。假设您从核心库类派生了20个类。随着库的下一次更新,您的20个类也可能需要更改。这是因为受保护破坏了封装

进一步阅读 有几个很好的资源描述了关于这个问题的所有漂亮细节,可以在程序员SE网络上找到一个很好的总结。现在,我试图对其进行更多的总结

使用
受保护的
倾向于:

  • 导致问题
  • 导致问题
  • 违反
  • 继承优于组合的设计
  • 导致更多的违反规则

  • 另一个很好的参考资料来自罗伯特·C·马丁(化名鲍勃叔叔)。

    例如:如果父亲有一个保险箱,并把密码给了儿子。儿子可以在不通知父亲的情况下从保险箱取钱,或者通过其他方式。不管是哪种方式,都不能保证儿子从保险箱里拿钱后会把这件事告诉父亲

    另一方面,如果儿子总是向父亲要钱,那么父亲可以跟踪支出情况并控制如何花钱

    这相当于封装。保持字段私有并公开公共或受保护的方法始终是最佳做法。这样,负责人(声明字段的地方)可以隐藏字段如何修改的详细信息,但可以访问与方法调用方相关的信息


    这也屏蔽了未来的变化。例如,假设您有一个名为total的字段。如果您允许直接访问该字段,则无法保证该字段没有被错误修改和引入错误。但是,如果您仅通过方法()授予访问权限,则可以更改计算的执行方式,调用该方法的任何人都不会受到影响,也不会从更改中受益。

    一个奇怪的说法。需要小心使用的不是关键词,而是继承关系。
    class Father { protected int asdf; }
    class Son extends Father { int qwer = 2 * asdf; }
    
    class Father { protected int fdsa; }
    class Son extends Father { int qwer = 2 * asdf; } // compile error