构造函数中的可覆盖方法调用有什么问题?我有一个Wicket页面类,它根据抽象方法的结果设置页面标题。public abstract class BasicPage extends WebPage {
public BasicPage() {
add(new Label("title", getTitle()));
}
protected abstract String getTitle();}NetBeans通过消息“构造函数中的可覆盖方法调用”警告我,但它应该有什么问题呢?我能想象的唯一选择是将其他抽象方法的结果传递给子类中的超级构造函数。但是很多参数很难读懂。
4 回答
郎朗坤
TA贡献1921条经验 获得超9个赞
这是一个有助于理解这个的例子:
public class Main { static abstract class A { abstract void foo(); A() { System.out.println("Constructing A"); foo(); } } static class C extends A { C() { System.out.println("Constructing C"); } void foo() { System.out.println("Using C"); } } public static void main(String[] args) { C c = new C(); }}
如果您运行此代码,您将获得以下输出:
Constructing AUsing CConstructing C
你看?foo()
在C的构造函数运行之前使用C。如果foo()
要求C具有已定义的状态(即构造函数已完成),那么它将在C中遇到未定义的状态,并且事情可能会中断。而且由于你无法在A中知道被覆盖的foo()
预期,你会收到警告。
添加回答
举报
0/150
提交
取消