【问题标题】:Why an instance of an object breaks protected logic? [duplicate]为什么对象的实例会破坏受保护的逻辑? [复制]
【发布时间】:2019-10-27 10:20:48
【问题描述】:

我试图弄清楚受保护的访问修饰符如何在 Java 中的包继承之间起作用。

我有 2 个示例包 p1 和 p2。在 p1 中有一个类 A1 具有一个名为 protectedMember 的受保护访问实例变量,另一个类 B1 只是扩展了 A1。

在 p2 中,我有一个类 A2,它也扩展了 A1。 显然,在 A2 中,我将可以直接访问其父级(A1 类)的受保护成员,这很好,而且不在我的问题之内。

但是,如果我在 A2 中创建一个启动 A1 或其子 B1 的实例的方法 - 那么我无法访问此实例的受保护成员。为什么 ?与默认不同的受保护成员可被扩展类的包和外部包类访问。

那么为什么在“多包”继承中我可以直接到达父级的受保护成员,但不能通过实例。

请不要回答“你必须在父母的包裹里做”——我明白我必须这样做。

我想知道为什么?

package p2;

import p1.A1;
import p1.B1;

public class A2 extends A1 {
// please note  - multi package inheritance
    public  void test (){

        /*
        with non of the instances below I can reach the protected member in A1
         */
        A1 a1 = new A1();
        B1 b1 = new B1();
    }

}

【问题讨论】:

  • 详细解释in the JLS。不确定我能否回答为什么受保护的访问是这样设计的。

标签: java inheritance protected


【解决方案1】:

因为这是一个规则。仅当对象类型为 A2 而不是 A1 或 B1 实例时,才允许从 A2 访问 A1 或 B1 中声明的受保护成员或方法。 您可以在此处找到更多信息: https://docs.oracle.com/javase/specs/jls/se8/jls8.pdf

【讨论】:

    【解决方案2】:

    因为即使在扩展它的类之外,也有可能拥有A1 (A1 a1 = new A1()) 的实例。

    假设你有:

    public class B2 {
      public void test() {
        A1 a1 = new A1();
      }
    }
    

    显然访问A1 的受保护字段应该会失败。

    【讨论】:

      猜你喜欢
      • 2019-12-06
      • 2018-09-26
      • 2014-09-17
      • 2021-08-03
      • 2011-03-24
      • 2020-12-18
      • 2015-06-09
      • 2016-04-13
      • 1970-01-01
      相关资源
      最近更新 更多