【问题标题】:Logic behind behavior of the Java class protected members [duplicate]Java类受保护成员行为背后的逻辑[重复]
【发布时间】:2018-09-29 04:10:03
【问题描述】:

请有人向我解释一下这个特殊事实背后的逻辑(不是行为本身,而是逻辑),即我认为只能通过继承允许访问受保护的类成员(包括方法和字段),即通过子类型的引用– 而不是通过声明受保护成员的父类型的引用 – 如果子类位于不同的包中?

如果父类和子类都在同一个包中,是否也只允许通过继承调用选项?

还有为什么不允许从不同的继承树 (C) 访问 A 对另一个类 (B) 的受保护方法?

【问题讨论】:

  • 代码值一千字。
  • @j.seashell 我不同意这是重复的。这个问题主要是关于“为什么”,protected背后的逻辑。

标签: java protected access-modifiers


【解决方案1】:

只允许通过继承访问受保护的类成员<...>,即通过子类型的引用——而不是通过声明受保护成员的父类型的引用——如果子类位于不同的包?

这是因为protected 表示从子类或同一个包访问。从不同的类你只能从同一个包访问成员。这就是为什么您需要使用子类引用来引用成员。

如果父类和子类在同一个包中,是否也只允许通过继承调用选项?

如果调用者在同一个包中——你可以使用任何引用(父或子)

为什么不允许从不同的继承树 (C) 访问另一个类 (B) 的 A 的受保护方法?

很高兴看到代码,但根据我对问题的理解,这正是 protected 修饰符需要做的。

【讨论】:

    【解决方案2】:

    在实现某些东西时,您通常希望减少“攻击面”而不是暴露实现细节。这就是需要不同访问级别的原因。 protected 的原因是继承。我们需要比public(隐藏实现细节)更严格,但比private 更严格的东西——这样子类就可以访问。

    我认为这个逻辑最好用JLS §6.6.2. Details on protected Access来解释:

    对象的受保护成员或构造函数可以从包外部访问,只有负责实现该对象的代码才能在该包中对其进行声明。

    我认为这应该解释“类、包、子类在同一个包或不同包”的逻辑:

    • 类应该是明确的,类本身当然应该可以访问它的成员。
    • 子类(相同或不同的包)也是可以理解的。
    • 说实话,包不太合乎逻辑。可能的解释:同一个包中的其他类很可能会用于该对象的实现。

    我同意protected 有点不合逻辑。它结合了水平访问限制(这个包/其他包)和垂直访问限制(子类/非子类)。

    如果父类和子类都在同一个包中,是否也只允许通过继承调用选项?

    没有。同一包中的其他类也可以访问此类的受保护成员。

    还有为什么不允许从不同的继承树 (C) 访问 A 对另一个类 (B) 的受保护方法?

    这正是protected 的意图。这样做是为了向“外界”隐藏A 的实现细节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-03
      • 2012-10-09
      • 2013-07-05
      • 2021-02-16
      • 1970-01-01
      • 2012-05-26
      • 2012-11-20
      • 1970-01-01
      相关资源
      最近更新 更多