使用子类的方法阻止方法调用

时间:2011-04-14 03:35:47

标签: java methods subclass

我有一些原则上类似于以下内容的东西:

public class Generic {

    public Generic(){
        doStuff();
    }

    protected void doStuff(){
        System.out.println("Generic");
    }

}

public class Specific extends Generic {

    public Specific(){
        super();
    }

    protected void doStuff(){
        super.doStuff();
        System.out.println("Specific");
    }

}

我得到的错误表明虽然从超类中调用了该方法,但它正在调用子类的方法版本。在上面的例子中,实例化一个新的Specific将打印出“Generic”和“Specific”,即使doStuff()是由Generic的构造函数调用的。

长话短说,我不希望如此。在子类的方法中有一些附加功能,如果在对象完全初始化之前调用它,则会导致问题。我怎样才能在超类的构造函数中强制它使用自己的方法版本,而不是最专业的版本呢?

2 个答案:

答案 0 :(得分:5)

我认为你不能在Java中有一个A)可以被覆盖的函数,而B)在调用时不会多态化。我建议你做这样的事情来模拟你所问的行为:

public class Generic {

    public Generic(){
        doGenericStuff();
    }

    private final void doGenericStuff() {
        System.out.println("Generic");
    }

    protected doStuff(){
        doGenericStuff();
    }

}

public class Specific extends Generic {

    public Specific(){
        super();
    }

    protected doStuff(){
        super.doStuff();
        System.out.println("Specific");
    }

}

答案 1 :(得分:2)

如何在您的Specific类中创建一个初始化的布尔标志,如下所示:

public class Specific extends Generic {
    boolean initialized = false;
    public Specific(){
        super();
        initialized = true;
    }

    @Override
    protected void doStuff(){
        super.doStuff();
        if (!initialized) return;
        System.out.println("Specific");
    }

    public static void main(String[] args) {
        @SuppressWarnings("unused")
        Specific specific = new Specific();
    }
}

这个只调用Generic的doStuff()方法,因为当构造父类并且没有完全构造子类时,flag初始化为false。我认为这是不希望调用Specific的重写方法的主要原因。