我有一些原则上类似于以下内容的东西:
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的构造函数调用的。
长话短说,我不希望如此。在子类的方法中有一些附加功能,如果在对象完全初始化之前调用它,则会导致问题。我怎样才能在超类的构造函数中强制它使用自己的方法版本,而不是最专业的版本呢?
答案 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的重写方法的主要原因。