Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop - Fatal编程技术网

为什么';java是否允许为子类中的静态方法分配较弱的访问权限?

为什么';java是否允许为子类中的静态方法分配较弱的访问权限?,java,oop,Java,Oop,我理解为什么java不允许为重写的方法设置较弱的访问权限,但为什么静态方法也是如此?我的意思是,这些方法只是互相隐藏,对吗?那么从封装的角度看问题是什么呢 附言 我知道隐藏方法有5条规则 子类中的方法必须与父类中的方法具有相同的签名 班级 子类中的方法必须至少与 父类中的方法 子类中的方法不能抛出新的或已检查的异常 比父类方法中引发的任何异常的类更宽 如果该方法返回一个值,则该值必须与 父类,称为共同变量返回类型 如果子类中定义的方法标记为静态,则必须将其标记为静态 父类中的静态(方法隐藏)。同

我理解为什么java不允许为重写的方法设置较弱的访问权限,但为什么静态方法也是如此?我的意思是,这些方法只是互相隐藏,对吗?那么从封装的角度看问题是什么呢

附言

我知道隐藏方法有5条规则

  • 子类中的方法必须与父类中的方法具有相同的签名 班级
  • 子类中的方法必须至少与 父类中的方法
  • 子类中的方法不能抛出新的或已检查的异常 比父类方法中引发的任何异常的类更宽
  • 如果该方法返回一个值,则该值必须与 父类,称为共同变量返回类型
  • 如果子类中定义的方法标记为静态,则必须将其标记为静态 父类中的静态(方法隐藏)。同样,不得标记该方法 如果在父类(方法)中未标记为静态,则在子类中标记为静态 覆盖)

  • 但归根结底,从封装的角度来看,我并不明白同样的规则对方法隐藏是有效的
    静态方法具有特殊的访问权限,允许好友访问实例中的成员。例如,您可以有一个名为
    create
    的静态方法,该方法创建类的默认实例,并直接修改实例中的数据,而不使用实例属性或实例方法(仅用于用法示例,不一定是用法建议)

    由于这种特殊的访问权限,对静态方法的较低访问权限可以允许您在无法使用的状态下创建对象,或者以不可预测和非封装的方式修改对象


    对于大多数用户定义的类来说,这只是一个小麻烦,但在子分类(例如容器)时允许这样做可能会暴露严重的未定义行为问题。

    您能否详细说明“较弱的访问权限”是什么意思?当具有相同签名的方法具有访问修饰符时,其访问权限小于基类中具有相同名称的方法(表示可见性修饰符)?(
    public
    protected
    ,&c.)我认为这是由于访问控制的定义:Java编程语言提供了访问控制机制,以防止包或类的用户依赖于该包或类的实现的不必要细节。如果允许访问,则被访问的实体称为可访问。“---隐藏时,如果代码不遵循相同的访问控制规则,则可能会破坏语义关系@Carmine你是在暗示你可以覆盖静态方法吗?正如我在问题中提到的,我确实知道规则,我只是想了解其中的一个特定点。为什么不允许一个访问权限比它的隐藏版本弱的方法?假设java允许隐藏一个方法,那么会是什么呢?我知道什么不利于覆盖,但隐藏中没有这样的问题,是吗?你能勾勒出这样一个问题场景的示例吗?是的,请提供一个示例。我从来没有听说过静态方法拥有与非静态方法不同的权限。