由于子类尚未构造,在超类构造函数中调用抽象方法是不安全的吗?
但是,如果方法的行为不依赖于子类的构造,例如只返回一个关于子类的常量,它是否仍然不安全或它是否可靠地工作?
此外,如果它有效,如果我不想让超类抽象,怎么办呢?
更新:针对上一个问题
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 Pote的例子。
答案 0 :(得分:4)
通常(但不一定)认为不安全。正如您所说,超类可能没有完全构造,因此不会准备好处理子类在其重写方法中可能进行的所有调用。
但是,如果所有子类只返回一个不依赖于任何其他方法的常量,那么它应该没问题。唯一的缺点是您不能保证子类将以适当的方式覆盖该方法。
关于你的上一个问题:这不是抽象与具体超类的问题。这是在构造函数中调用可覆盖方法的问题。摘要与具体是不重要的。
根据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
答案 1 :(得分:1)
正如其他人所解释的那样,在超类构造函数中调用抽象方法存在固有的风险。
我发现的一个例外是子类提供了一些“常量”信息,例如getId()
,getHandledMessages()
等。