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()提供返回类型。我正在考虑这样做(我不需要单独的属性,只需要一个条件来检查初始化)。不管怎么说,我都要加分。