由于尚未构造子类,在超类构造函数中调用抽象方法是否不安全?
但是,如果方法的行为不依赖于子类的构造,例如只返回一个关于子类的常数,它是否仍然不安全,还是会可靠地工作?
而且,如果它有效的话,如果我不想使超类变得抽象,该如何做呢?
更新:关于最后一个问题
public class SuperClass {
public SuperClass() {
System.out.println(getValue());
}
public String getValue() {
return "superclass";
}
public static void main(String[] args) {
new SubClass();
}
}
class SubClass extends SuperClass {
public SubClass() {
super(); // Comment out this or not will not affect the result
}
public String getValue() {
return "subclass";
}
}我写了一个测试,并找出了它:结果是:subclass感谢@Tim的例子。
发布于 2012-11-15 03:31:21
它一般(虽然不一定)被认为不安全。正如您所说的,超类可能不是完全构造的,因此不会准备好处理子类在其重写方法中可能进行的所有调用。
但是,如果所有子类只是返回一个不依赖于任何其他方法的常量,则应该可以。唯一的缺点是无法保证子类会以适当的方式覆盖该方法。
关于最后一个问题:这不是一个抽象的和具体的超类的问题。这是在构造函数中调用overridable方法时的一个问题。抽象与具体是无关的。
编辑回应OP的评论
我不知道你所说的“多形性”是什么意思。调用虚拟方法总是调用子实现。只有通过super关键字才能调用超类实现。例如:
public class SuperClass {
public SuperClass() {
System.out.println(getValue());
}
public String getValue() {
return "superclass";
}
public static void main(String[] args) {
new SubClass();
}
public static class SubClass extends SuperClass {
public String getValue() {
return "subclass";
}
}
}打印subclass。
这是:
public class SuperClass {
public SuperClass() {
System.out.println(getValue());
}
public String getValue() {
return "superclass";
}
public static void main(String[] args) {
new SubClass();
}
public static class SubClass extends SuperClass {
public String getValue() {
return super.getValue() + " subclass";
}
}
}打印superclass subclass
发布于 2012-11-15 03:34:45
正如其他人所解释的,在超类构造函数中调用抽象方法存在固有的风险。
我发现的一个例外是子类提供了一些“常量”信息,例如getId()、getHandledMessages()和诸如此类的信息。
https://stackoverflow.com/questions/13391140
复制相似问题