假设存在以下基类:
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
即使孩子处于不同的包装中,孩子们也可以看到字段和方法。
谢谢!
我认为受保护的字段和方法对于孩子来说是可见的,即使后者在其他程序包中也是如此。
没错 类本身可以访问继承的受保护成员。但是,您要尝试getHeight
在 某个 Control引用上调用该方法。您只能在 此 实例上调用它!
为了更好地理解,让我引用Kathy
Sierra的SCJP准备指南:
但是,包的子类可以访问超类(父)成员是什么意思?这意味着子类继承成员。但是,这并不意味着包之外的子类可以使用对超类实例的引用来访问成员。换句话说,保护=继承。
子类只能通过继承看到受保护的成员 。
问题内容: 我想从提供此受保护方法的类的子类中调用另一个实例的受保护方法。请参见以下示例: 告诉我。我看不到这的原因(我以为我已经在其他代码中这样做了)。我想保持此方法的保护,我该怎么办? 编辑 我想提供一个简化的版本,但我没有想到事实是,这些类位于不同的程序包中。 问题答案: 您可以通过子类化和重写来访问受保护的方法。当它们在同一包装中时也是如此。我将添加一些细节。您可以在此处阅读详细信息。 您
问题内容: Modifier Class Package Subclass World public Y Y Y Y protected Y Y Y N no modifier Y Y N N private Y N N N 请帮助我了解受保护的Java的具体工作 问题答案: 为什么?因为这就是Java编程语言的设计方式。没什么更多的了。 可以从中访问的东西 班级本身 同一包中的类(是否为子类无关
如何使用Mockito或PowerMock模拟一个由子类实现,但从抽象超类继承的受保护方法? 换句话说,我想测试“DoSomething”方法,同时嘲弄“DoSomethingElse”。 抽象超类 子类实现 解决方案 这里给出的答案是正确的,如果涉及的类是在同一包中,将会起作用。 但如果涉及不同的包,一个选择是使用PowerMock。下面的例子对我有效。当然可能有其他的方法,这是一个可行的。 注
问题内容: 在Java中,为什么不能在接口中使用受保护的方法? 由于根据Java规范 受保护的访问(由关键字protected表示)-同一包中任何类型以及任何包中的子类均可访问的字段或方法。 如果我必须使用该接口,那么我将实现它并覆盖方法。因此,如果我要实现类可以访问这些方法的位置,因为该方法可以在任何包中访问。那么,将方法声明为Interface中的保护有什么害处? 问题答案: 受保护的方法旨在
问题内容: 有谁知道, 为什么 AbstractList (以及ArrayList)中的removeRange方法是?它看起来像是一个定义明确且有用的操作,但是仍然要使用它,我们不得不对List实现进行子类化。 有一些隐藏的理由吗?对我来说似乎莫名其妙。 问题答案: 是的,因为这不是您从外部代码中删除范围的方式。相反,请执行以下操作: 这实际上是在幕后。† OP询问为什么不属于公共API。原因在《
问题内容: 考虑从官方的这段代码OpenJDK源码的: 这里的用例是什么,为什么一般来说编写这样的代码有意义? 问题答案: 仍然可以通过同一包中的代码访问成员。我的猜测是,该类在某些早期版本(可能甚至不是公共版本)中曾经是非最终的,然后被设置为最终的,并且受保护的方法保持原样,因为在使用它的同一包中可能有代码(而不是之所以将其更改为私有包,仅仅是因为没有人看到这样做的好处。