为什么我不能从Java中另一个包中的inheritance类调用受保护的方法?
假设有以下基类:
package bg.svetlin.ui.controls; public abstract class Control { protected int getHeight() { //.. } //... }
此外,在同一个包中,有一个inheritance的类:
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
inheritance自Control
,并且getHeight()
protected
,也会出现以下错误:
getHeight()在bg.svetlin.ui.controls.Control中具有受保护的访问权限
我检查过我的import是对的。 我正在使用NetBeans。
知道什么是错的吗? 我认为孩子们可以看到protected
字段和方法,即使后者是在不同的包中。
谢谢!
我认为孩子们可以看到受保护的字段和方法,即使后者是在不同的包中。
那是对的。 类本身可以访问inheritance的受保护成员。 但是,你试图在一些 Control引用上调用getHeight
方法。 你只能在这个实例上调用它!
为了更好地理解,让我引用Kathy Sierra的SCJP准备指南 :
但是,对于子类 – 包外的访问超类(父)成员意味着什么? 这意味着子类inheritance了该成员。 但是,它并不意味着子类外包可以使用对超类实例的引用来访问该成员。 换句话说,protected = inheritance。 子类只能通过inheritance来查看受保护的成员 。
你是对的。 可以从子类访问的任何protected
成员或method
,但是您希望在addControl
方法中访问参数实例的受保护方法。 您只能访问List
类的protected
方法( this.getHeight()
)