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

时间:2012-03-03 12:38:38

标签: java oop inheritance attributes

假设有以下基类:

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字段和方法对孩子们来说是可见的,即使后者在不同的包中。

谢谢!

2 个答案:

答案 0 :(得分:18)

  

我认为受保护的字段和方法是   即使后者处于不同的包装中,也能看到孩子们。

这是对的。类本身可以访问继承的受保护成员。但是,您尝试在某些控件引用上调用getHeight方法。您只能在实例上调用它!

为了更好地理解,让我引用Kathy Sierra的SCJP Preparation Guide

  

但是对于包外的子类来说它意味着什么   访问超类(父)成员?这意味着子类继承   会员。然而,它并不意味着   subclass-outside-the-package可以使用引用访问该成员   到超类的一个实例。换句话说,protected =   遗产。 子类可以看到受保护的成员   只能通过继承

答案 1 :(得分:2)

你是对的。可以从子类访问的任何protected成员或method,但您希望在addControl方法中访问参数实例的受保护方法。您只能访问protected类(List

this.getHeight()方法