2013-09-01 4 views
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(); 
    } 
} 

ВыходКонструкторы перегрузкой в ​​Java

Fifth 

Я ожидал, что следующий будет поток

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

Это происходит, но после того, как последний конструктор выполняется я думал, остальные строки, варианты выполнения float, int и no-arg будут выполняться, потому что у них есть код для обработки, и разве это не так, как они работают.

Я предполагаю, что выполнение конструкторов основано на стеке (исправьте меня, если я ошибаюсь).

+1

It ** ** комплект на основе. Добавьте 'System.out.println (this.s);' каждому конструктору и посмотрите результат. – lulyon

+0

System.out.println отсутствует, и this.s + = являются виновниками ..Tx Eric/lulyon – user2655970

ответ

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").

+0

Спасибо Эрик .. я получил его сейчас – user2655970

1

Редактировать Эрик указал на актуальную проблему, которая заключается в том, что вы печатаете this.s после того, как она была изменена только один раз. Также, как он говорит, если бы у вас было += во всех правильных местах, они были бы объединены в противоположном порядке того, что вы ожидаете.

Обратите внимание, что с этими конструкторами существует серьезная проблема в том, что если вы используете какой-либо другой, кроме первого, он будет выходить из-за отсутствия нулевой ссылки. Вы должны иметь:

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

в начале всех конструкторов, кроме первого.

+0

'this.s =" Пятый "' выполняется перед любым из операторов '+ =', поэтому я сомневаюсь, что это проблема. – Eric

+0

Я согласен с Эриком. Потому что, когда я держу this.s + = "Пятый" .. Я получаю nullFifth как вывод. – user2655970

0

Вы видите только Fifth потому, что ваш вызов System.out.println() прямо после this.s = "Fifth";

Если добавить System.out.println после каждого дополнение к с, вы получите:

Fifth 
FifthFourth 
FifthFourthThird 
FifthFourthThirdSecond 
First

Сначала сбрасывает его, потому что вы использовали = вместо +=. Исправьте это, и вы получите:

Fifth 
FifthFourth 
FifthFourthThird 
FifthFourthThirdSecond 
FifthFourthThirdSecondFirst