Привет, ребята, мне нужна помощь с этим кодом, чтобы лучше понять конструкторы и методы. Почему java сначала вызывает конструктор First, а не Default ?:

public class Human {
    private String name;
    private int age;

    public Human() {
        this("Alex", 25);
        System.out.println("Default constructor called");
    }

    public Human(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("First constructor called");
    }

    public Human(String name) {
        this.name = name;
        System.out.println("Second constructor called");
    }

    public String info(){
        return name+" "+age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    } }

И

package com.company;

public class Main {

    public static void main(String[] args) {
        System.out.println("Create object 1");
        Human person = new Human();
        System.out.println(person.info());
        System.out.println("Create object 2");
        Human person2 = new Human("Mike",55);
        System.out.println(person2.info());
    }
}

Итак, вывод:

Create object 1
First constructor called
Default constructor called    
Alex 25 
Create object 2 
First constructor called 
Mike 55
-2
Ess 28 Май 2017 в 15:50

2 ответа

Лучший ответ

Это утверждение :

Human person = new Human();

Вызовет конструктор по умолчанию, который определен как здесь:

public Human() {
    this("Alex", 25);
    System.out.println("Default constructor called");
}

Теперь первый оператор this("Alex",25) будет вызывать другой конструктор, определенный здесь:

public Human(String name, int age) {
    this.name = name;
    this.age = age;
    System.out.println("First constructor called");
}

Этот другой конструктор устанавливает некоторые поля экземпляра, а затем печатает «Первый вызванный конструктор», когда он заканчивается, мы возвращаемся к нашему конструктору по умолчанию в this("Alex",25) и к следующему оператору, который печатает «Конструктор по умолчанию вызвал».

Вкратце: ваша печать успешно вызвала другой конструктор, что заставило вас думать, что другой конструктор был вызван первым.

3
niceman 28 Май 2017 в 13:01

Это ведет себя точно так, как и предполагалось, давайте свернем вызовы функций:

System.out.println("Create object 1");
Human person = new Human();
--this("Alex", 25);
----this.name = name;
----this.age = age;
----System.out.println("First constructor called");
--System.out.println("Default constructor called");
System.out.println(person.info());
System.out.println("Create object 2");
Human person2 = new Human("Mike",55);
--this.name = name;
--this.age = age;
--System.out.println("First constructor called");
System.out.println(person2.info());
3
Yochai Timmer 28 Май 2017 в 12:59