为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

构造函数中的可覆盖方法调用有什么问题?我有一个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()预期,你会收到警告。


查看完整回答
反对 回复 2019-05-29
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

在构造函数中调用可覆盖的方法允许子类颠覆代码,因此您无法保证它可以再次工作。这就是你收到警告的原因。

在您的示例中,如果子类重写getTitle()并返回null 会发生什么?

要“修复”这个,你可以使用工厂方法而不是构造函数,它是对象实例的常见模式。


查看完整回答
反对 回复 2019-05-29
  • 4 回答
  • 0 关注
  • 952 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信