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、および no-arg コンストラクターのバリアントが実行されると思いました。処理するコードがあり、それらがどのように機能するかではないためです。

コンストラクターの実行はスタックベースであると想定しています (間違っている場合は修正してください)。

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()に出力するか、print ステートメントを の最後に移動するparent()(そして に変更= "First"する)必要があります+= "First"

于 2013-09-01T03:01:16.513 に答える
1

編集エリックは実際の問題を指摘しましたthis.s。それは、一度だけ変更された後に印刷しているということです。また、彼が言うように+=、適切な場所にすべてあると、予想とは逆の順序で連結されます。

これらのコンストラクターには、最初のコンストラクター以外を使用すると、null 参照のためにエラーが発生するという大きな問題があることに注意してください。あなたが持っている必要があります:

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

最初のコンストラクターを除くすべてのコンストラクターの先頭。

于 2013-09-01T03:00:11.223 に答える
0

FifthSystem.out.println() 呼び出しが直後にあるため、表示されているだけですthis.s = "Fifth";

s に追加するたびに System.out.println を追加すると、次のようになります。

5番目
五四
5 番目 4 番目 3 番目
5 番目 4 番目 3 番目 2 番目
初め

=の代わりに使用したため、最初にリセットします+=。それを修正すると、次のようになります。

5番目
五四
5 番目 4 番目 3 番目
5 番目 4 番目 3 番目 2 番目
5 番目 4 番目 3 番目 2 番目 1 番目
于 2013-09-01T03:04:44.963 に答える