从抽象类中引用实例变量

问题描述

我有一个抽象类,列出了每个子类应实现的内容。对于每个子类,大多数方法将具有不同的实现,但是对于所有子类,某些方法将是相同的。我希望将在抽象类中定义的方法相同,以便不会将同一方法粘贴到几个不同的类中。但是,当我在抽象的子类的实例上调用方法时,会收到一个空指针,因为我想,在抽象类中实现的方法将引用抽象的字段,而不是实例的字段。

有人可以指出缺陷在哪里吗?

例如:

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的基础无关。如果您在派生类中使用与基类相同的字段名称,则基实例将被遮盖。