【问题标题】:protected references in Java [duplicate]Java中的受保护引用[重复]
【发布时间】:2015-09-12 02:16:27
【问题描述】:

我有三个班级:

package pac;

public class A {
    protected A a;  
    protected final int i = 10;
}

public class B extends A {

    void foo() {
        A a = new A();
        int b = a.a.i;  //compiles fine
    }
}

package another.pac;

public class C extends A {

    void foo() {
        A a = new A();
        int b = a.a.i;  //Does not compile. a.a is inaccessible
    }
}

为什么我们不能从放入另一个包中访问受保护的成员,但我们可以从同一个包中访问?它们都是一个的子类,因此应该允许访问。

JLS 6.6.2.1 说:

如果通过字段访问表达式 E.Id 或方法进行访问 调用表达式 E.Id(...) 或方法引用表达式 E :: Id,其中 E 是主表达式(第 15.8 节),则访问权限为 当且仅当 E 的类型是 S 或 S 的子类时才允许。

C 类满足要求。怎么了?

【问题讨论】:

  • 这就是protected的思想,只有同一个包中的类才能访问它...否则公开
  • @Danielson 这就是受保护的想法,只有同一个包中的类才能访问它...否则将其公开。不正确。
  • @ChetanKinger 很好的解释...非打包类不能直接访问字段...可以通过继承,但是你调用的是包内的类
  • @Danielson 但是你正在调用包内的一个类。不明白你的意思。你能详细说明一下吗?

标签: java protected


【解决方案1】:

只有通过继承才能在包外的子类中访问protected 成员。试试这个:

public class C extends A {

    void foo() {
       int b = i;  
    }
}

【讨论】:

  • 是的,我只是不明白它是如何回答我的问题的。我相信你只是不明白我在找什么。我已经说清楚了。
  • @stella 您刚刚进行了编辑,引用了 JLS,当我发布答案时,这不是您的问题的一部分。在您编辑之前,我的回答确实回答了您的问题。即使在您编辑之后,我的回答仍然解释了protected 成员的黄金法则。 只有通过继承才能在包外的子类中访问受保护的成员你不明白吗?不要因为您缺乏理解而对答案投反对票。
  • 不,现在我知道了规则。很清楚。
【解决方案2】:

没有必要每次都做参考。我想你没看懂Inheritence..

public class B extends A {

    void foo() {
       // A a = new A(); No need to instantiate it here as B extends A
        int b = i;  //No nedd to refer it through a.a.i  
    }
}

package another.pac;

public class C extends A {

    void foo() {
        C c=new C();
        int d=c.i//this will work fine
       //   A a = new A(); same as above explanation
        int b = i;  //same as above and even a.i will not compile
    }
}

现在您的受保护变量将可以在此处访问..

【讨论】:

    【解决方案3】:

    A 类是包 pac 的一部分;

    并且 C 类是包 another.pac 的一部分,因此它将无法访问其成员。如果 C 是包 pac 的一部分,那么它将能够访问该成员

    查看以下帖子:In Java, difference between default, public, protected, and private

    【讨论】:

      猜你喜欢
      • 2021-02-16
      • 1970-01-01
      • 2018-05-16
      • 2023-03-25
      • 1970-01-01
      • 2013-02-03
      • 2012-09-21
      • 2012-03-27
      • 2018-05-04
      相关资源
      最近更新 更多