猿问

构造函数中的可覆盖方法调用有什么问题?

构造函数中的可覆盖方法调用有什么问题?

我有一个Wicket页面类,它根据抽象方法的结果设置页面标题。

public abstract class BasicPage extends WebPage {
    public BasicPage() {
        add(new Label("title", getTitle()));
    }
    protected abstract String getTitle();}

NetBeans通过消息“构造函数中的可覆盖方法调用”警告我,但它应该有什么问题呢?我能想象的唯一选择是将其他抽象方法的结果传递给子类中的超级构造函数。但是很多参数很难读懂。


梵蒂冈之花
浏览 1033回答 4
4回答

郎朗坤

这是一个有助于理解这个的例子: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()预期,你会收到警告。

杨__羊羊

在构造函数中调用可覆盖的方法允许子类颠覆代码,因此您无法保证它可以再次工作。这就是你收到警告的原因。在您的示例中,如果子类重写getTitle()并返回null 会发生什么?要“修复”这个,你可以使用工厂方法而不是构造函数,它是对象实例的常见模式。
随时随地看视频慕课网APP
我要回答