我对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!!
答案 0 :(得分: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的实施。