如果在类初始化期间调用重写的基本方法,则实例字段不会初始化

Dra*_*gon 1 java

有一个基类ServerAdapter:

public abstract class ServerAdapter {
    public ServerAdapter() {
        initGUI();
    }

    protected abstract void initGUI();
}
Run Code Online (Sandbox Code Playgroud)

还有一个继承的子类ServerAdapter:

public abstract class LinuxServerAdapter extends ServerAdapter {
    protected CheckBox key = new CheckBox();

    public LinuxServerAdapter() {
        super();
    }

    @Override
    public void initGUI() {
        //NPE is thrown here, because key = null
        key.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                //Something happens here
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

继承LinuxServerAdapter的结束类:

public class MyLinuxServerAdapter extends LinuxServerAdapter {

    public MyLinuxServerAdapter() {
        super();
    }

    public static void main(String args[]) {
        ServerAdapter server = new MyLinuxServerAdapter();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试在键上添加clickHandler时抛出NPE.

为什么key没有初始化?这是初始化顺序以特定方式工作的情况吗?

Sed*_*nus 5

只需在init方法中初始化.这毕竟是目的..

@Override
public void initGUI() {
    key = new CheckBox();
    key.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            //Something happens here
        }
    });
Run Code Online (Sandbox Code Playgroud)

父母课程在孩子面前得到实例化.在您的顶级父类中,您调用initGUI()抽象方法,该方法的实现位于其子级中,该子级尚未初始化其他字段.将字段的实际初始化移动到initGUI()方法是有意义的,它符合名称约定和所获得的逻辑.