Освоение конструкторов Java: типы, использование и практические примеры
Конструкторы в Java
В этом уроке мы изучим конструкторы Java, их типы и использование на примерах.
Что такое конструктор?
Конструктор в Java похож на метод, который вызывается при создании объекта класса.
В отличие от методов Java, конструктор имеет то же имя, что и класс, и не имеет возвращаемого типа. Например,
class Test {
Test() {
// тело конструктора
}
}
Здесь Test() — конструктор. Он имеет то же имя, что и класс, и не имеет типа возврата.
Рекомендуемое чтение: Почему конструкторы не возвращают значений
Пример 1: Конструктор в Java
class Main {
private String name;
// конструктор
Main() {
System.out.println("Конструктор вызван:");
name = "Programiz";
}
public static void main(String[] args) {
// конструктор вызывается при
// создании объекта класса Main
Main obj = new Main();
System.out.println("Имя: " + obj.name);
}
}
Вывод:
Конструктор вызван: Имя: Programiz
В примере создан конструктор Main(). Внутри конструктора инициализируется значение переменной name.
Обратите внимание на оператор создания объекта класса Main.
Main obj = new Main();
Здесь при создании объекта вызывается конструктор Main(), и значение name инициализируется.
Поэтому программа выводит значение name как Programiz.
Типы конструкторов
В Java конструкторы делятся на 3 типа:
- Конструктор без аргументов (No-Arg)
- Параметризованный конструктор
- Конструктор по умолчанию (Default)
1. Конструкторы без аргументов в Java
Как и методы, конструктор может иметь параметры или не иметь их.
Если конструктор не принимает параметров, он называется конструктором без аргументов. Например,
private Constructor() {
// тело конструктора
}
Пример 2: Приватный конструктор без аргументов
class Main {
int i;
// конструктор без параметров
private Main() {
i = 5;
System.out.println("Конструктор вызван");
}
public static void main(String[] args) {
// вызов конструктора без параметров
Main obj = new Main();
System.out.println("Значение i: " + obj.i);
}
}
Вывод:
Конструктор вызван Значение i: 5
В примере создан конструктор Main() без параметров. Следовательно, это no-arg конструктор.
Обратите внимание: конструктор объявлен как private.
Когда конструктор объявлен private, он недоступен извне класса. Создание объектов извне класса запрещено приватным конструктором.
Здесь мы создаем объект внутри того же класса. Поэтому программа имеет доступ к конструктору. Подробнее: Реализация приватного конструктора в Java.
Однако, если нужно создавать объекты извне класса, конструктор должен быть public.
Пример 3: Публичный конструктор без аргументов
class Company {
String name;
// публичный конструктор
public Company() {
name = "Programiz";
}
}
class Main {
public static void main(String[] args) {
// объект создается в другом классе
Company obj = new Company();
System.out.println("Название компании = " + obj.name);
}
}
Вывод:
Название компании = Programiz
Рекомендуемое чтение: Модификаторы доступа в Java
2. Параметризованный конструктор в Java
Конструктор Java может принимать один или более параметров. Такие конструкторы называются параметризованными (конструктор с параметрами).
Пример 4: Параметризованный конструктор
class Main {
String languages;
// конструктор, принимающий одно значение
Main(String lang) {
languages = lang;
System.out.println(languages + " Programming Language");
}
public static void main(String[] args) {
// вызов конструктора с передачей значения
Main obj1 = new Main("Java");
Main obj2 = new Main("Python");
Main obj3 = new Main("C");
}
}
Вывод:
Java Programming Language Python Programming Language C Programming Language
В примере создан конструктор Main(), принимающий один параметр. Обратите внимание на выражение,
Main obj1 = new Main("Java");
Здесь мы передаем единственное значение конструктору. На основе переданного аргумента переменная languages инициализируется внутри конструктора.
3. Конструктор по умолчанию в Java
Если мы не создаем никаких конструкторов, Java-компилятор автоматически создает конструктор без аргументов во время выполнения программы. Этот конструктор называется конструктором по умолчанию.
Пример 5: Конструктор по умолчанию
class Main {
int a;
boolean b;
public static void main(String[] args) {
// вызывается конструктор по умолчанию
Main obj = new Main();
System.out.println("Значения по умолчанию:");
System.out.println("a = " + obj.a);
System.out.println("b = " + obj.b);
}
}
Вывод:
a = 0 b = false
Здесь мы не создавали конструкторов. Поэтому компилятор автоматически создал конструктор по умолчанию.
Конструктор по умолчанию инициализирует неинициализированные переменные экземпляра значениями по умолчанию.
| Тип | Значение по умолчанию |
|---|---|
boolean | false |
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
char | \u0000 |
float | 0.0f |
double | 0.0d |
object | null |
В программе переменные a и b инициализированы значениями по умолчанию 0 и false соответственно.
Программа эквивалентна:
class Main {
int a;
boolean b;
// приватный конструктор
private Main() {
a = 0;
b = false;
}
public static void main(String[] args) {
// вызов конструктора
Main obj = new Main();
System.out.println("Значения по умолчанию:");
System.out.println("a = " + obj.a);
System.out.println("b = " + obj.b);
}
}
Результат программы тот же, что и в Примере 5.
Важные замечания о конструкторах Java
- Конструкторы вызываются неявно при инстанцировании объектов.
- Два правила создания конструктора:
Имя конструктора должно совпадать с именем класса.
Конструктор Java не должен иметь возвращаемого типа. - Если у класса нет конструктора, компилятор автоматически создает конструктор по умолчанию во время выполнения. Он инициализирует переменные экземпляра значениями по умолчанию. Например,
intпеременная будет инициализирована0. - Типы конструкторов:
No-Arg Constructor — конструктор без аргументов
Parameterized constructor — конструктор с аргументами
Default Constructor — автоматически создаваемый компилятором конструктор, если не определен явно. - Конструктор не может быть
abstract,staticилиfinal. - Конструкторы можно перегружать (overload), но не переопределять (override).
Перегрузка конструкторов в Java
Как и перегрузка методов, можно создать два или более конструкторов с разными параметрами. Это называется перегрузкой конструкторов.
Пример 6: Перегрузка конструкторов в Java
class Main {
String language;
// конструктор без параметров
Main() {
this.language = "Java";
}
// конструктор с одним параметром
Main(String language) {
this.language = language;
}
public void getName() {
System.out.println("Programming Language: " + this.language);
}
public static void main(String[] args) {
// вызов конструктора без параметров
Main obj1 = new Main();
// вызов конструктора с параметром
Main obj2 = new Main("Python");
obj1.getName();
obj2.getName();
}
}
Вывод:
Programming Language: Java Programming Language: Python
В примере два конструктора: Main() и Main(String language). Оба инициализируют переменную language разными значениями.
В зависимости от параметра, переданного при создании объекта, вызываются разные конструкторы и присваиваются разные значения.
Также возможно вызывать один конструктор из другого. Подробнее: Вызов одного конструктора из другого в Java.
Примечание: Мы использовали ключевое слово this для указания переменной класса. Подробнее о this: Ключевое слово this в Java.
java
- Понимание конструкторов в C++: конструкторы по умолчанию, параметризованные и копирования
- Освоение операторов Java: типы, синтаксис и практические примеры
- Комментарии в Java: типы, использование и лучшие практики
- Освоение улучшенного цикла for в Java: синтаксис, примеры и лучшие практики
- Освоение конструкторов Java: типы, использование и практические примеры
- Освоение строк в Java: создание, методы и лучшие практики
- Ключевое слово this в Java: практическое применение, конструкторы и примеры
- Интерфейсы в Java: концепции, реализация и лучшие практики
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Конструкторы в Java Enums: объяснение с практическим примером