Что такое конструктор в Java?

Ответ

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

Характеристики конструктора

  • Имя конструктора должно точно совпадать с именем класса.
  • Не имеет возвращаемого типа (даже void).
  • Может иметь модификаторы доступа (public, protected, private или package-private).
  • Поддерживает перегрузку (overloading) — в классе может быть несколько конструкторов с разными параметрами.
  • Если в классе не объявлен ни один конструктор, компилятор автоматически добавляет конструктор по умолчанию (без параметров).
  • Конструктор может вызывать другой конструктор этого же класса с помощью this(...) (должен быть первой инструкцией).

Примеры

public class Person {
    private String name;
    private int age;
    private static int personCount = 0;

    // 1. Конструктор по умолчанию (явный)
    public Person() {
        this("Unknown", 0); // Вызов другого конструктора
    }

    // 2. Параметризованный конструктор
    public Person(String name, int age) {
        // Проверка предусловий (часть контракта)
        if (age < 0) {
            throw new IllegalArgumentException("Age cannot be negative");
        }
        this.name = name;
        this.age = age;
        personCount++;
    }

    // 3. Конструктор копирования
    public Person(Person other) {
        this(other.name, other.age);
    }
}

// Использование
Person p1 = new Person();           // Вызов конструктора 1
Person p2 = new Person("Alice", 30); // Вызов конструктора 2
Person p3 = new Person(p2);         // Вызов конструктора 3

Конструктор vs метод: Конструктор создаёт и инициализирует объект, а метод выполняет операции над уже существующим объектом.

Ответ 18+ 🔞

Ну, слушай сюда, разберём этот конструктор, блядь. Это ж не просто какая-то хуйня, а самая первая команда, которую твой свежеиспечённый объект получает, как только вылез из печки оператором new. Его задача — не ебучую философию вести, а тупо набить поля этого новорождённого данными, чтобы он не был пустым, как голова у идиота.

Что за зверь такой, конструктор?

  • Имя у него должно быть один в один с именем класса. Не "похоже", а именно так, ёпта. Если класс Person, то и конструктор Person. Иначе компилятор тебе такой: "чё за хуйню ты мне подсунул?".
  • Возвращать он нихуя не должен. Даже void писать нельзя — это его отличительная черта, как родинка у шлюхи.
  • Может быть разной доступности: public, private и прочая хуета. Если private — значит, создавать объекты могут только методы внутри самого класса, для всяких хитрожопых паттернов вроде синглтона.
  • Их может быть овердохуища в одном классе — это называется перегрузка. Один без параметров, другой с именем, третий с именем и возрастом... Главное, чтобы списки аргументов отличались, а то получишь конфликт, как два барана на мосту.
  • Если ты такой ленивый мудак и не написал ни одного конструктора — компилятор, вздохнув, добавит тебе конструктор по умолчанию сам. Без параметров, пустой. Но стоит тебе написать хоть один свой — этот дефолтный волшебным образом испаряется, и если он был нужен — пиши его сам, засранец.
  • Один конструктор может позвать другого конструктора этого же класса через this(...). Но это надо делать первой строчкой, иначе компилятор опять начнёт ныть.

Примеры, чтобы совсем пиздец стало понятно:

public class Person {
    private String name;
    private int age;
    private static int personCount = 0;

    // 1. Конструктор по умолчанию (явный). Сделали сами, потому что можем.
    public Person() {
        this("Unknown", 0); // Вызов другого конструктора. Первая строчка — помнишь, да?
    }

    // 2. Параметризованный конструктор. Основной рабочий мудак.
    public Person(String name, int age) {
        // Проверка предусловий. Не пускаем всякую хуйню.
        if (age < 0) {
            throw new IllegalArgumentException("Age cannot be negative, мудила!");
        }
        this.name = name; // this.name — это поле объекта, name — это аргумент.
        this.age = age;
        personCount++; // Статическое поле, считает всех созданных персон.
    }

    // 3. Конструктор копирования. Сделал копию, и похуй.
    public Person(Person other) {
        this(other.name, other.age); // Опять зовём второго. Удобно же.
    }
}

// Использование
Person p1 = new Person();           // Вызов конструктора 1 (который позовёт конструктор 2)
Person p2 = new Person("Alice", 30); // Вызов конструктора 2 напрямую
Person p3 = new Person(p2);         // Вызов конструктора 3 (скопировали p2)

Конструктор vs метод: Это вообще две большие разницы, как хуй и палец! Конструктор — это родильный дом, он объект из небытия вызывает и сразу пелёнками обматывает. А метод — это уже детский сад или армия, он с уже готовым объектом что-то делает: заставляет работать, меняет его состояние или просто пиздит. Не путай, а то получишь ебаный компaйл-тайм еррор, и будешь сидеть, чесать репу.