Java构造函数调用另一个构造函数

时间:2015-04-23 22:41:32

标签: java syntax constructor compiler-errors syntax-error

我是Java新手,我试图在其他构造函数中调用构造函数。这是我的代码:

class TestContructor {
    public TestContructor(){
        String params = "1, 2, 3";
        this(params);
    }
    public TestContructor(String params){
        System.out.println("TestContructor with params: " + params);
    }
}

class TestRunner {
    public static void main(String[] args) {
        new TestContructor();
    }
}

然后我收到了这个错误:

javac -g Test.java
Test.java:5: error: call to this must be first statement in constructor
        this(params);
            ^
1 error

好吧,我更改了TestConstructor代码:

class TestContructor {
    public TestContructor(){
        // String params = "1, 2, 3";
        this("1, 2, 3"); //Now is the first statement
    }
    public TestContructor(String params){
        System.out.println("TestContructor with params: " + params);
    }
}

好的,没问题。

那么,在java中调用另一个构造函数是否必须在第一个语句行中声明它?

如果我在调用其他构造函数之前需要执行某种处理呢?

我记得我在java编程方面比较新,但我遇到了这个问题,我想知道是否可以这样做。

1 个答案:

答案 0 :(得分:1)

是的,这是一条规则。

如果您需要先做其他工作,那么您唯一真正的选择就是将该工作重构为另一种方法。类似的东西:

public TestConstructor(String params) {
    // whatever
}

public TestConstructor(String... paramParts) {
    this(combineParts(paramParts));
}

private static String combineParts(String[] parts) {
    StringBuilder sb = new StringBuilder();
    for (String part : parts) {
        sb.append(part);
    }
    return sb.toString();
}

如果您有各种相互依赖的计算(例如,您需要调用this(foo, bar),其中bar取决于foo和其他组件{{1}的答案}),然后你可以链接构造函数更多。类似的东西:

baz

请注意,我已将辅助构造函数设为私有。如果public TestConstructor(FooComponent1 f1, FooComponent2 f2, Baz baz) { this(createFoo(f1, f2), baz); } private TestConstructor(Foo foo, Baz bar) { this(foo, createBar(baz)); } private TestConstructor(Foo foo, Bar bar) { // do whatever } 是私有内部类,则此功能特别有用,因此外部调用者无法创建一个并将其传入。