为什么我不能从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); } } 

即使Listinheritance自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()