Ответ
Конструктор — это специальный метод класса, который вызывается при создании нового объекта оператором 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йл-тайм еррор, и будешь сидеть, чесать репу.