java中的构造函数问题

时间:2009-06-02 17:32:29

标签: java class

public class StateQueryFilter extends FieldQueryFilter {
   // private static final Log LOG = LogFactory.getLog(RecommendedParser.class.getName());

    public StateQueryFilter() {
        super("state", 5f);
        super("city", 5f);
        super("notdirectory", 5f);
        //LOG.info("Added a state query");
    }

}

它报告:

Constructor call must be the first statement in a constructor   

有没有办法让它发挥作用?

4 个答案:

答案 0 :(得分:7)

你只能在构造函数中调用super一次,它必须是第一行。

在你做的事情中多次调用它甚至没有意义。调用super不会创建新对象;它只是让超类初始化它的字段。您是否真的尝试不止一次初始化相同的字段?您可能正在尝试创建三个单独的对象,但这不是实现它的方法。

另请参阅Java教程中的Using the keyword super

答案 1 :(得分:2)

不。你试图构造对象3次,逻辑是有缺陷的。

答案 2 :(得分:2)

来自section 8.8.7 of the Java Language Specification

  

构造函数的第一个语句   body可能是一个显式的调用   同一个类的另一个构造函数   或直接超类   (§8.8.7.1)。

注意“第一”陈述 - 你不能有多个。

答案 3 :(得分:2)

我发现调用setter丑陋的构造函数。

另一种选择是拥有一个带参数的构造函数。

public StateQueryFilter() {
    super(/*state*/ 5, /* city */ 5, /*notdirectory*/ 5);
    //LOG.info("Added a state query");
}

然而,看起来你应该做像

这样的事情
public class StateQueryFilter extends FieldQueryFilter {
    private final String city;
    private final String state;
    private final boolean noDirectory;

    public StateQueryFilter(String city, String state, boolean noDirectory) {
        this.state = state;
        this.city = city;
        this.notDirectory = notDirectory;
    }
}
// later
FieldQueryFilter filter = new StateQueryFiler("Los Angeles", "California", true);

BTW:不要使用浮动值,它们几乎不是最佳选择。