public class Employee {
private static int id;
private int employeeId;
private String name;
private String position;
private int salary;
private String department;
public Employee(){
this("A", "B", 1);
System.out.println("Empty constructor called");
}
public Employee(String name, String position, int salary){
this(name, position, salary, "IT");
System.out.println("Constructor with 3 params called");
}
private Employee(String name, String position, int salary, String department){
employeeId = id++;
this.name = name;
this.position = position;
this.salary = salary;
this.department = department;
System.out.println("Constructor with 4 params called");
}
public int getEmployeeId(){
return employeeId;
}
}
public class Test {
public static void main(String[] args) {
Employee employee = new Employee();
}
}
Не понимаю почему так странно выводится информация в консоль:
Constructor with 4 params called
Constructor with 3 params called
Empty constructor called
Согласен с VBugaenko и позволю себе немного более подробно объяснить (для уточнения). Первым делом вызывается конструктор без параметров:
public Employee()
в нем 2 строчки кода:
this("A", "B", 1);
означает вызов второго конструктора с тремя параметрами, а:
System.out.println("Empty constructor called");
вывод на консоль текста "Empty constructor called". Так вот в данном месте этот текст не выводится сразу, а сначала вызывается конструктор с тремя параметрами - он же раньше был, в первой строчке конструктора. Далее все аналогично: в конструкторе с тремя параметрами сначала вызывается конструктор с четырьмя параметрами:
this(name, position, salary, "IT");
и следующий вывод на консоль "Constructor with 3 params called" также сразу не выводится, пока не вызовится конструктор с четырьмя параметрами. Этот вызванный конструктор (тот, что с четырьмя))) уже не вызывает еще один конструктор, а занимается присвоением значений переменным:
employeeId = id++;
this.name = name;
this.position = position;
this.salary = salary;
this.department = department;
и затем выводит на консоль "Constructor with 4 params called". А уже после этого в обратном порядке отрабатываются вывод на консоль "Constructor with 3 params called", и уже в последнюю очередь вывод на консоль из самого первого конструктора без параметров: "Empty constructor called".
Небольшое уточнение - если представленный код будет в одном файле, то он не скомпилируется, т.к. оба класса Test и Employee объявлены как public, а это не разрешено.
Все отработано верно: был создан объект класса
new Employee()
и отработал конструктор без параметров (о чем и было сообщение в консоль "Empty constructor called"), в нем был вызван конструктор с 3мя параметрами
this("A", "B", 1)
и он тоже отлично отработал (соответствующее сообщение в консоль тоже выведено), ну и наконец был вызван конструктор с 4мя параметрами
this(name, position, salary, "IT");
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У меня есть файлы properties, в которых юникодом закодированы сообщения, использующие кириллицуПримерно так:
Имеется БД со схемой и таблицей внутри с полями id и url, пытаюсь добавить информацию (id и url) в БД PostgreSQL через Hibernate, вываливается ошибка:
Мне требуется логировать подготовленные запросы в groovy
Есть родительский класс,который является абстракцией при создании экземпляров дочерних классовКак можно с инстанса родителя, получить...