[英]Calling an abstract method in super class's construtor in Java
由于子类尚未构造,在超类构造函数中调用抽象方法是不安全的吗?
但是,如果方法的行为不依赖于子类的构造,例如只返回关于子类的常量,它是否仍然不安全或者它是否可靠地工作?
而且,如果它有效,如果我不想让超类抽象怎么办呢?
更新:最后一个问题
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的例子。
通常(但不一定)认为它是不安全的。 正如您所说,超类可能没有完全构造,因此不会准备好处理子类在其重写方法中可能进行的所有调用。
但是,如果所有子类只返回一个不依赖于任何其他方法的常量,那么它应该没问题。 唯一的缺点是您不能保证子类将以适当的方式覆盖该方法。
关于你的最后一个问题:这不是抽象与具体超类的问题。 这是在构造函数中调用可覆盖方法的问题。 抽象与具体是不重要的。
编辑以回应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
正如其他人所解释的那样,在超类构造函数中调用抽象方法存在固有的风险。
我发现的一个例外是当子类提供一些“常量”信息时,例如getId()
, getHandledMessages()
等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.