2014-12-22 2 views
0

После прочтения перегруженных конструкторов из книги, я устал следующий код:перегруженные конструкторы

public class Employee { 

    String name; 
    int idNumber; 

    public Employee(){ 
     this("JJ", 0); 
     System.out.println(name +" "+ idNumber); 
    } 

    public Employee(String name, int num){ 

     this.name = name; 
     idNumber = num; 
     System.out.println(name +" 2nd "+ idNumber); 
    } 
} 


public class Object1 { 

    public static void main(String[] args) { 

     Employee emp = new Employee(); 
    } 

} 

ВЫХОД:

JJ 2nd 0 

JJ 0 

Я действительно запутался. Почему «JJ 2nd 0» напечатал сначала «JJ 0» ?? Я создал объект-сотрудник сотрудника emp и не передавал никаких аргументов в параметре, не предполагается ли сначала вызвать первый конструктор?

+2

Возможно, если бы люди использовали [отладчики] (HTTP://www.vogella.com/tutorials/EclipseDebugging/article.html), это не будет проблемой. – Qix

+0

@ Qix Спасибо. Никогда не слышал об отладчике раньше, но я сделал google, и теперь я узнаю, как его использовать. – OPK

+1

Я только что понял, вы задали ряд вопросов, но пока не приняли никаких ответов. Было бы неплохо принять некоторых, если бы они были действительно полезны, как способ сказать «спасибо», и указать будущим пользователям, которые рассматривают вопрос, ответ на который наилучшим образом ответил на вопрос. –

ответ

5

new Employee(); является ссылающегося

public Employee(){ 
    this("JJ", 0); 
    System.out.println(name +" "+ idNumber); 
} 

В этом конструкторе

this("JJ", 0);

вызывает

public Employee(String name, int num)

конструктор, который заканчивается вызовом

System.out.println(name +" 2nd "+ idNumber);.

, который отвечает за печать

JJ второй 0

Когда this("JJ", 0); закончит System.out.println(name +" "+ idNumber); будет вызван и вы увидите еще одну строку

JJ 0

2

Конструктор без аргументов звонит другой конструктор с аргументами с помощью следующей строки:

this("JJ", 0); 
+4

Не уверен, что случилось с нисходящим потоком на этом ... –

+1

Не могу договориться больше. Отвечает на вопрос. – Adam

4

Когда вы написали:

... new Employee(); 

В итоге вы вызываете конструктор по умолчанию (без аргумента). первая строка кода в этом конструкторе:

this("JJ", 0); 

Что вызывает конструктор 2-параметра, в котором вы пишете

System.out.println(name +" 2nd "+ idNumber); 

Это первый из двух операторов вывода ваша программа сталкивается , и, таким образом, это первое, что вы видите на консоли.

После этого вывода заявления, программа возвращается к значению по умолчанию конструктора без аргументов, и продолжает выполнять Вашему другому оператор вывода

System.out.println(name +" "+ idNumber); 

который является «вторым» оператором вывода вы видите.

Если вы пройдете через свой код с помощью отладчика, зайдите последовательно, вы увидите, как именно выполняется программа, и должны продемонстрировать то, о чем я говорю.

0

Сначала он вызывает первый конструктор, но первая строка в нем является вызовом второго конструктора. Когда вы создаете объект Employee из метода main, вы вызываете конструктор Employee() без аргументов (первый). Этот конструктор сначала вызывает второй конструктор, который печатает JJ 2nd 0, а затем первый конструктор печатает строку JJ 0. Это, как он запускается на выполнение:

  1. Когда метод main вызывается первый конструктор, new Employee(), называется.
  2. Конструктор вызывает второй конструктор.
  3. Второй конструктор печатает JJ 2nd 0, а затем все готово.
  4. Первый конструктор продолжается следующей строкой, которая является System.out.println(name +" "+ idNumber);, и печатает JJ 0.
1

Вы должны прочитать о ключевом слове для этого, просто для начала его, как и объект класса your'e с использованием,

     See in the first constructor this("JJ","0") means that a constructor having two arguments is being invoked so the first line redirects the control into the second constructor that's is why the other line is printed first. 
Смежные вопросы