0
class parent {
    String s;

    parent() {
         this(10);
         this.s = "First";
    }
    parent(int a){
         this(10.00f);
         this.s += "Second";
    }
    parent(float b){
         this("sss");
         this.s += "Third";
    }
    parent(String c){
         this('a');
         this.s += "Fourth";
    }
    parent(char d){
         this.s = "Fifth"; 
         System.out.println(this.s);
    }
}

class chain {
    static public void main(String[] string) {
        parent p = new parent();
    }
}

输出是

Fifth

我预计以下将是流程

parent()->parent(int a)->parent(float b)->parent(String c)->parent(char d).

这种情况发生了,但是一旦执行了最后一个构造函数,我认为剩余的 String、float、int 和无参数构造函数变体将被执行,因为它们确实有代码要处理,而不是它们的工作方式。

我假设构造函数的执行是基于堆栈的(如果我错了,请纠正我)。

4

3 回答 3

4

你是对的,也是错的。

其他构造函数中的剩余代码确实会this.s执行,但您会在它们执行之前打印出 的值。

以下是您的代码流,按时间垂直顺序排列:

parent()
  this(10)
    this(10.00f)
      this("sss")
        this('a')
          this.s = "Fifth"
          System.out.println(this.s)
        this.s += "Fourth"
      this.s += "Third"
    this.s += "Second"
  this.s = "First"

您需要在p.s之后打印出来new parent(),或者将您的打印语句移到末尾parent()(并更改= "First"+= "First")。

于 2013-09-01T03:01:16.513 回答
1

编辑Eric 指出了实际问题,即您this.s在仅修改一次后打印出来。正如他所说,如果你+=在所有正确的地方都有,它们会按照你所期望的相反顺序连接起来。

请注意,这些构造函数的一个主要问题是,如果您使用第一个以外的任何构造函数,它将由于空引用而出错。你应该有:

if(this.s == null){
   this.s = "";
}

在除第一个之外的所有构造函数的开头。

于 2013-09-01T03:00:11.223 回答
0

您只是看到,Fifth因为您的 System.out.println() 电话紧随其后this.s = "Fifth";

如果在每次添加到 s 之后添加一个 System.out.println,你会得到:

第五
第五第四
第五第四第三
第五第四第三第二
第一的

首先重置它,因为您在=那里使用而不是+=. 修复它,你会得到:

第五
第五第四
第五第四第三
第五第四第三第二
第五第四第三第二第一
于 2013-09-01T03:04:44.963 回答