假设有以下基类:
package bg.svetlin.ui.controls;
public abstract class Control {
protected int getHeight() {
//..
}
//...
}
此外,在同一个包中,有一个继承的类:
package bg.svetlin.ui.controls;
public abstract class LayoutControl extends Control {
public abstract void addControl(Control control);
//...
}
然后,在另一个包中有第三个类:
package bg.svetlin.ui.controls.screen;
public abstract class Screen extends LayoutControl {
//...
}
最后,还有实现类,在另一个包中:
package bg.svetlin.ui.controls.screen.list;
public class List extends Screen {
private final Vector controls = new Vector();
public void addControl(Control control) {
height += control.getHeight();
controls.addElement(control);
}
}
即使List
继承自Control
,而getHeight()
仍为protected
,也会出现以下错误:
getHeight()在bg.svetlin.ui.controls.Control中具有受保护的访问权限
我检查过我的进口是对的。我正在使用NetBeans。
知道什么是错的吗?我认为protected
字段和方法对孩子们来说是可见的,即使后者在不同的包中。
谢谢!
答案 0 :(得分:18)
我认为受保护的字段和方法是 即使后者处于不同的包装中,也能看到孩子们。
这是对的。类本身可以访问继承的受保护成员。但是,您尝试在某些控件引用上调用getHeight
方法。您只能在此实例上调用它!
为了更好地理解,让我引用Kathy Sierra的SCJP Preparation Guide:
但是对于包外的子类来说它意味着什么 访问超类(父)成员?这意味着子类继承 会员。然而,它并不意味着 subclass-outside-the-package可以使用引用访问该成员 到超类的一个实例。换句话说,protected = 遗产。 子类可以看到受保护的成员 只能通过继承。
答案 1 :(得分:2)
protected
成员或method
,但您希望在addControl
方法中访问参数实例的受保护方法。您只能访问protected
类(List
)的this.getHeight()
方法