【问题标题】:Why can't I call a protected method from an inheriting class in another package in Java?为什么我不能从 Java 中另一个包中的继承类调用受保护的方法?
【发布时间】:2012-03-21 17:14:29
【问题描述】:

假设有以下基类:

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

谢谢!

【问题讨论】:

  • 在你的抽象类中方法是getWidth(),在你使用的子类中getHeight()。这仅仅是因为它是示例代码吗?
  • 是的。感谢您发现这一点。

标签: java oop inheritance attributes


【解决方案1】:

我认为受保护的字段和方法是 对孩子可见,即使后者在不同的包中。

没错。类本身可以访问继承的受保护成员。但是,您尝试在 some 控件参考上调用 getHeight 方法。您只能在 this 实例上调用它!

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

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

【讨论】:

  • 我怎样才能让一个方法只对一个类及其子类可用呢?谢谢!
  • 就像我说的,它可用于您的子类。但是您只允许在 this 引用上调用它,例如 this.getHeight()(当然,this 是可选的)。但是,将访问器方法设为 public 是一种常见的做法。
  • 尺寸和位置将由我的图书馆自动保存,所以我想让它们对图书馆保密。看来我得把它们公之于众了。谢谢!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 2020-08-02
    • 2018-04-06
    • 1970-01-01
    • 2018-08-23
    • 2015-06-24
    • 2023-04-08
    • 1970-01-01
    • 2018-10-21
    相关资源
    最近更新 更多