【问题标题】:Java constructor calling another constructor [duplicate]Java构造函数调用另一个构造函数[重复]
【发布时间】:2015-07-02 08:36:02
【问题描述】:

我是 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 编程的新手,但我遇到了这个问题,我想知道是否有可能做到我想要的。

【问题讨论】:

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


    【解决方案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 和其他一些组件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
    }
    

    请注意,我已将辅助构造函数设为私有。如果Bar 是一个私有内部类,这将特别有用,因此外部调用者无法创建一个并将其传入。

    【讨论】:

      猜你喜欢
      • 2016-07-03
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 2017-01-05
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      相关资源
      最近更新 更多