为什么我不能从Java中另一个包中的继承类调用受保护的方法?

Alb*_*ore 8 java oop inheritance attributes

假设有以下基类:

package bg.svetlin.ui.controls;

public abstract class Control {
    protected int getHeight() {
        //..
    }
    //...
}
Run Code Online (Sandbox Code Playgroud)

此外,在同一个包中,有一个继承的类:

package bg.svetlin.ui.controls;

public abstract class LayoutControl extends Control {
    public abstract void addControl(Control control);
    //...
}
Run Code Online (Sandbox Code Playgroud)

然后,在另一个包中有第三个类:

package bg.svetlin.ui.controls.screen;

public abstract class Screen extends LayoutControl {
    //...
}
Run Code Online (Sandbox Code Playgroud)

最后,还有实现类,在另一个包中:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

尽管List从继承ControlgetHeight()IS protected,有以下错误:

getHeight()在bg.svetlin.ui.controls.Control中具有受保护的访问权限

我检查过我的进口是对的.我正在使用NetBeans.

知道什么是错的吗?我认为protected孩子们可以看到田野和方法,即使孩子们在不同的包装中也是如此.

谢谢!

jFr*_*tic 18

我认为孩子们可以看到受保护的字段和方法,即使后者是在不同的包中.

那是对的.类本身可以访问继承的受保护成员.但是,你正试图getHeight一些 Control引用上调用该方法.你只能在这个实例上调用它!

为了更好地理解,让我引用Kathy Sierra的SCJP准备指南:

但是,如果子类 - 包外有权访问超类(父)成员,这意味着什么?这意味着子类继承了成员.但是,它并不意味着子类外包可以使用对超类实例的引用来访问该成员.换句话说,protected = inheritance.子类只能通过继承来查看受保护的成员.