Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 防止方法调用使用子类';s法_Java_Methods_Subclass - Fatal编程技术网

Java 防止方法调用使用子类';s法

Java 防止方法调用使用子类';s法,java,methods,subclass,Java,Methods,Subclass,我有一些原则上类似于以下内容: public class Generic { public Generic(){ doStuff(); } protected void doStuff(){ System.out.println("Generic"); } } public class Specific extends Generic { public Specific(){ super();

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

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”,即使Generic的构造函数调用了doStuff()


长话短说,我不想那样。在子类的方法中添加了一些功能,如果在对象完全初始化之前调用它,就会导致问题。在超类的构造函数中,我如何才能强制它使用自己的方法版本,而不是最专门的方法?

我认为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");
    }

}

在您的特定类中设置一个初始化的布尔标志怎么样,如下所示:

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();
    }
}

这个函数只调用泛型的doStuff()方法,因为当父类被构造而子类未完全构造时,标志initialized为false。我认为这是不希望调用Specific的重写方法的主要原因。

Specific应该扩展泛型吗?…是的。是的。修复了,谢谢。您没有为doStuff()提供返回类型。我正在考虑这样做(我不需要单独的属性,只需要一个条件来检查初始化)。不管怎么说,我都要加分。