【问题标题】:why i cannot access protected member of a class from 3 rd class in another package? [duplicate]为什么我不能从另一个包中的第三类访问受保护的类成员? [复制]
【发布时间】:2022-01-19 09:50:51
【问题描述】:

我有 3 节课

package a;

public class A {
    protected void add(){}
}

package b;

import a.A;

public class B extends A {
    public static void main(String[] args) {
        B b=new B();
        b.add();//this is works
    }
}

package b;

public class C {
    public static void main(String[] args) {
        B b=new B(); 
        b.add(); //this will not work 
    }
}

问题是 B 类应该有自己的 add 方法副本,那么为什么我不能从同一个包中的 C 类访问它?

【问题讨论】:

  • B 可以看到该方法,因为它是子类,C 不是。

标签: java methods compiler-errors protected


【解决方案1】:

引用JLS 6.6.2.1:

6.6.2.1。访问受保护的成员

C 成为声明受保护成员的类。仅允许在 C 的子类 S 的主体内访问。

void add() 是类A 的受保护成员。

B 的主体内允许访问,因为它是A 的子类。 C 的主体内不允许访问,因为它不是 A 的子类。

【讨论】:

    【解决方案2】:

    B 没有自己的 add 方法副本。它从受保护的 A 继承它 - 即,只有扩展 A 或驻留在同一包中的类才能访问它。

    但是,您可以为它显式创建一个公共委托器,以便其他类可以使用它:

    public class B extends A {
        @Override
        public void add() {
            super.add();
        }
    }
    

    【讨论】:

      【解决方案3】:

      6.6.2。受保护访问的详细信息

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

      JLS

      【讨论】:

        猜你喜欢
        • 2015-06-09
        • 2012-05-09
        • 2013-03-05
        • 1970-01-01
        • 2013-11-25
        • 2012-07-22
        • 1970-01-01
        • 2013-07-10
        相关资源
        最近更新 更多