问题描述
我有一个抽象类,列出了每个子类应实现的内容。对于每个子类,大多数方法将具有不同的实现,但是对于所有子类,某些方法将是相同的。我希望将在抽象类中定义的方法相同,以便不会将同一方法粘贴到几个不同的类中。但是,当我在抽象的子类的实例上调用该方法时,会收到一个空指针,因为我想,在抽象类中实现的方法将引用抽象的字段,而不是实例的字段。
有人可以指出缺陷在哪里吗?
例如:
abstract class ControlView {
String[] controls;
abstract void render();
void release() {
for (int i = 0; i <= controls.length; i++) {
//Release the controls
}
}
}
class StartingControls extends ControlView{
String[] controls;
Button uiDrawButton;
Button uiLoadButton;
StartingControls() {
this.controls = new String[2];
uiDrawButton = new Button();
this.controls[0] = uiDrawButton;
uiLoadButton = new Button();
this.controls[1] = uiLoadButton;
}
public void render() {
//Unique Render implementation
}
}
当我打电话
instanceOfStartingControls.release();
显然,我想遍历构造它时放入instanceOfStartingControls控件字段的两个字符串。我不想要遍历显然存在于抽象中的未初始化数组。
是访问修饰符或静态方法的某种组合使它无法按其应有的方式工作,还是我在抽象类上缺少了一些关键的知识?这似乎是一个基本问题,但是我很难说出来,所以我对搜索的任何结果都不满意。
解决方法
有两个名为controls
的数组。派生类中的一个使基类中的一个模糊,因此基实例永远不会设置为非null。
从派生类中删除声明。
此问题与abstract
的基础无关。如果您在派生类中使用与基类相同的字段名称,则基实例将被遮盖。