Конструкторы и ключевое слово this (пример)

151
14 ноября 2019, 14:00
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
Answer 1

Согласен с 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, а это не разрешено.

Answer 2

Все отработано верно: был создан объект класса

new Employee()  

и отработал конструктор без параметров (о чем и было сообщение в консоль "Empty constructor called"), в нем был вызван конструктор с 3мя параметрами

this("A", "B", 1) 

и он тоже отлично отработал (соответствующее сообщение в консоль тоже выведено), ну и наконец был вызван конструктор с 4мя параметрами

this(name, position, salary, "IT");
READ ALSO
Есть ли способ отображать юникод как симоволы кириллицы в редакторе Intellij Idea?

Есть ли способ отображать юникод как симоволы кириллицы в редакторе Intellij Idea?

У меня есть файлы properties, в которых юникодом закодированы сообщения, использующие кириллицуПримерно так:

145
Ошибка при добавлении записи в БД через Hibernate

Ошибка при добавлении записи в БД через Hibernate

Имеется БД со схемой и таблицей внутри с полями id и url, пытаюсь добавить информацию (id и url) в БД PostgreSQL через Hibernate, вываливается ошибка:

121
Логирование подготовленного запроса в groovy

Логирование подготовленного запроса в groovy

Мне требуется логировать подготовленные запросы в groovy

113
Выполнить метод дочернего класса

Выполнить метод дочернего класса

Есть родительский класс,который является абстракцией при создании экземпляров дочерних классовКак можно с инстанса родителя, получить...

135