为什么我无法访问受保护的方法?

时间:2015-05-29 16:44:57

标签: java

我对JAVA中不同包的保护机制有疑问。我无法理解的是,为什么这种方法不起作用!

package A;
class A 
{
    protected void method(){}; 
}

package B;
import A.A;

class B extends A
{

}

class Main extends A
{
    B b = new B();
    b.method();// ERROR: method() has protected access in Package1.A
}

Why!!

1 个答案:

答案 0 :(得分:2)

JLS 6.6.2

  

可以从中访问受保护的成员或构造函数   在包之外,只能通过代码声明它   负责实施该对象

作为一个子类并不意味着你负责实施。

这里有一个例子,再次来自JLS:

package points;
public class Point {
    protected int x, y;
    void warp(threePoint.Point3d a) {
        if (a.z > 0)  // compile-time error: cannot access a.z
            a.delta(this);
    }
}

package threePoint;
import points.Point;
public class Point3d extends Point {
    protected int z;
    public void delta(Point p) {
        p.x += this.x;  // compile-time error: cannot access p.x
        p.y += this.y;  // compile-time error: cannot access p.y
    }
    public void delta3d(Point3d q) {
        q.x += this.x;
        q.y += this.y;
        q.z += this.z;
    }
}
  

此处的方法增量发生编译时错误:它无法访问   受保护的成员x和y的参数为p,因为while   Point3d(对字段x和y的引用出现的类)是   Point的子类(声明x和y的类),它是   没有参与Point的实现(类型的   参数p)。 delta3d方法可以访问受保护的成员   它的参数为q,因为Point3d类是Point和的子类   参与了Point3d的实施。