Перегрузка конструкторов в Java — Объяснение с практическими примерами кода
Что такое конструктор в Java?
Конструктор — это специальный метод, инициализирующий только что созданный объект сразу после выделения памяти. Он устанавливает поля объекта в желаемые значения или, если опущен, в их значения по умолчанию. Определение конструктора необязательно; если ни одного не предоставлено, компилятор поставляет стандартный, присваивающий стандартные значения по умолчанию:
- Числовые примитивы (int, double и т.д.) → 0
- char → '\0'
- Ссылочные типы → null
Это руководство охватывает:
- Правила создания конструкторов
- Перегрузка конструкторов
- Цепочка конструкторов
Правила создания Java-конструктора
- Имя конструктора должно точно совпадать с именем класса.
- Он не может иметь тип возврата, даже
void.
Пример 1 — Первый конструктор
Шаг 1: Введите следующий код в ваш Java-редактор.
class Demo {
int value1;
int value2;
Demo() {
value1 = 10;
value2 = 20;
System.out.println("Inside Constructor");
}
public void display() {
System.out.println("Value1 === " + value1);
System.out.println("Value2 === " + value2);
}
public static void main(String[] args) {
Demo d1 = new Demo();
d1.display();
}
}
Шаг 2: Скомпилируйте и запустите программу. Вывод:
Inside Constructor Value1 === 10 Value2 === 20
Перегрузка конструкторов в Java
Java позволяет классу определять несколько конструкторов с разными списками параметров. Компилятор отличает их по количеству и типам параметров.
Валидные конструкторы для класса Account могут выглядеть так:
Account(int a); Account(int a, int b); Account(String a, int b);
Пример 2 — Перегруженные конструкторы
Шаг 1: Вставьте следующий код.
class Demo {
int value1;
int value2;
/* Demo() {
value1 = 10;
value2 = 20;
System.out.println("Inside 1st Constructor");
} */
Demo(int a) {
value1 = a;
System.out.println("Inside 2nd Constructor");
}
Demo(int a, int b) {
value1 = a;
value2 = b;
System.out.println("Inside 3rd Constructor");
}
public void display() {
System.out.println("Value1 === " + value1);
System.out.println("Value2 === " + value2);
}
public static void main(String[] args) {
Demo d1 = new Demo();
Demo d2 = new Demo(30);
Demo d3 = new Demo(30, 40);
d1.display();
d2.display();
d3.display();
}
}
Шаг 2: Скомпилируйте и запустите. Вы получите ошибку, потому что конструктор по умолчанию Demo() отсутствует после добавления параметризованного конструктора. Чтобы использовать конструктор по умолчанию, явно объявите его:
Demo() {
// инициализация по умолчанию или пользовательская логика
}
После раскомментирования закомментированного блока и повторной компиляции программа запускается корректно.
Цепочка конструкторов
Когда инстанцируется подкласс, сначала выполняется конструктор суперкласса — это известно как цепочка конструкторов.
Пример 3 — Цепочка между родителем и ребенком
Шаг 1: Скопируйте код ниже.
class Demo {
int value1;
int value2;
Demo() {
value1 = 1;
value2 = 2;
System.out.println("Inside 1st Parent Constructor");
}
Demo(int a) {
value1 = a;
System.out.println("Inside 2nd Parent Constructor");
}
public void display() {
System.out.println("Value1 === " + value1);
System.out.println("Value2 === " + value2);
}
public static void main(String[] args) {
DemoChild d1 = new DemoChild();
d1.display();
}
}
class DemoChild extends Demo {
int value3;
int value4;
DemoChild() {
// super(5); // Раскомментируйте, чтобы вызвать перегруженный конструктор родителя
value3 = 3;
value4 = 4;
System.out.println("Inside the Constructor of Child");
}
public void display() {
System.out.println("Value1 === " + value1);
System.out.println("Value2 === " + value2);
System.out.println("Value3 === " + value3);
System.out.println("Value4 === " + value4);
}
}
Шаг 2: Запустите программу. Поскольку конструктор ребенка не вызывает super() явно, сначала выполняется конструктор по умолчанию Demo(). Ожидаемый вывод:
Inside 1st Parent Constructor Inside the Constructor of Child Value1 === 1 Value2 === 2 Value3 === 3 Value4 === 4
Шаг 3: Чтобы вызвать перегруженный конструктор родителя Demo(int a), поместите super(5); как первую строку в конструкторе ребенка. После раскомментирования строки и повторного запуска:
Inside 2nd Parent Constructor Inside the Constructor of Child Value1 === 5 Value2 === 0 Value3 === 3 Value4 === 4
Использование super(...) обязательно, когда вам нужен конкретный конструктор суперкласса, выполняемый перед логикой подкласса.
java
- Освоение перегрузки конструкторов в C#
- Java Hello World: ваша первая программа
- Освоение конструкторов Java: типы, использование и практические примеры
- Конструкторы в Java Enums: объяснение с практическим примером
- Освоение String.indexOf() в Java: поиск подстрок и практические примеры
- Освоение String.compareTo() в Java: синтаксис, сценарии использования и примеры
- Ключевое слово static в Java: переменные, методы и блоки — практические примеры
- Java-программа для определения, является ли число простым
- Java-программа для вывода простых чисел от 1 до 100 — пошаговое руководство
- Конвертация char в String в Java — практические примеры и лучшие практики