【问题标题】:Why doesn't java allow to assign weaker access privileges to static methods in a child class?为什么java不允许为子类中的静态方法分配较弱的访问权限?
【发布时间】:2016-06-14 04:53:23
【问题描述】:

我明白为什么 java 不允许为被覆盖的方法设置较弱的访问权限,但为什么静态方法是一样的呢?我的意思是,这些方法只会相互隐藏,对吧?那么从封装的角度来看有什么问题呢?

附言

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

  1. 子类中的方法必须与父类中的方法具有相同的签名 类。
  2. 子类中的方法必须至少与 父类中的方法。
  3. 子类中的方法可能不会抛出新的检查异常或 比父类方法中抛出的任何异常的类更广泛。
  4. 如果方法返回一个值,它必须是相同的或者是该方法的子类 父类,称为协变返回类型。
  5. 子类中定义的方法如果标记为静态,则必须标记为静态 父类中的静态(方法隐藏)。同样,该方法不得标记 如果在父类中未标记为静态,则在子类中为静态(方法 覆盖)。

但毕竟,我没有从封装的角度得到这个想法

【问题讨论】:

  • 您能否详细说明“较弱的访问权限”是什么意思?
  • 当签名相同的方法的访问修饰符的访问权限低于基类中的同名方法时
  • 表示可见性修饰符? (publicprotected 等)
  • 我认为这是由于访问控制的定义:“Java 编程语言提供了访问控制机制,以防止包或类的用户依赖于不必要的实现细节包或类。如果允许访问,则称所访问的实体是可访问的。 --- 如果代码不遵循相同的访问控制规则,则隐藏它可能会破坏语义关系。 docs.oracle.com/javase/specs/jls/se8/html/jls-6.html#jls-6.6
  • @Carmine 你是在暗示你可以覆盖静态方法吗?

标签: java oop


【解决方案1】:

同样的规则是有效的并且对于方法隐藏 https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.8.3

【讨论】:

  • 正如我在问题中提到的,我确实知道规则,我只是想了解其中的一个具体点。不允许访问权限比隐藏版本弱的方法的原因是什么?
  • 假设java允许隐藏一个方法,那会是什么呢?我知道什么会不利于覆盖,但是隐藏起来没有这样的问题,是吗?
【解决方案2】:

静态方法具有特殊的访问权限,允许好友访问实例中的成员。例如,您可以有一个名为 create 的静态方法,它创建类的默认实例并直接修改实例中的数据,而不使用实例属性或实例方法(仅作为使用示例,不一定是使用建议)。

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

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

【讨论】:

  • 你能勾勒出这样一个有问题的场景的例子吗?
  • 是的,请提供一个例子。我从未听说过静态方法与非静态方法具有不同的权限。
猜你喜欢
  • 2012-07-23
  • 2021-10-01
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
相关资源
最近更新 更多