Разберемся в устройстве классов из которых создают объекты на примере кода:
var user = new User("Danil", "Miloshin");
// метод возвращает имя
user.getFirstName(); // "Danil"
// метод возвращает фамилию
user.getLastName(); // "Miloshin"
// метод возвращает полное имя
user.getFullName(); // "Danil Miloshin"
Первая строчка – это создание объекта из класса. За это отвечает оператор new
. Затем идет "вызов" класса как функции с передачей туда аргументов. В реальности класс, конечно же, не вызывается. Вызывается конструктор класса, специальный метод, определенный внутри класса и имеющий такое же имя как и класс:
class User {
// Возвращаемый тип не указывается, так как конструктор не может ничего возвращать
// И здесь нет слова static
User(String firstName, String lastName) {
// тут код инициализации
}
}
Конструктор нужен для инициализации объекта. В нашем примере нужно записать данные пользователя так, чтобы они остались внутри даже после завершения выполнения конструктора. Для этого потребуются свойства:
class User {
public String firstName;
public String lastName;
}
Свойства выглядят как переменные, определенные внутри класса («на уровне класса») с добавленными к ним модификаторами доступа, как у методов. Как они заполняются? Через конструктор во время создания объекта:
class User {
public String firstName;
public String lastName;
User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
Обратите внимание на this
— это указатель на текущий объект. Через него мы можем читать и записывать свойства, а также вызывать методы нашего объекта. Зачем это нужно? Без this
код выглядит так name = value
, то есть как установка значения в обычную переменную. Такой код приводил бы к путанице.
Свойства хранят данные объектов, причем у каждого объекта они свои. Если мы создадим двух пользователей, то между собой они никак не будут взаимодействовать, так как this
указывает на конкретный объект:
var user1 = new User("Jonny", "Depp");
var user2 = new User("Selina", "Dion");
// Обращение к свойству
user1.firstName; // "Jonny"
user2.firstName; // "Selina"
Свойства можно не только читать, но и менять:
user1.firstName = "Maya";
user1.firstName; // "Maya"
Конструктор по умолчанию
Иногда у объектов начальная инициализация необязательна, либо ее вообще нет. В таком случае определять конструктор не нужно, так как Java определяет для каждого класса конструктор по умолчанию. Это обычный конструктор, но без параметров:
// Пример
class Car {
public String make;
// Его не нужно добавлять
// Java сама создает такой конструктор если нет других
Car() {
}
}
var car = new Car();
car.make = "bmw";
System.out.println(car.make); // "bmw"
Перегрузка конструктора
Перегрузка методов распространяется и на конструктор. В зависимости от ситуации можно добавлять любые конструкторы, которые удобно.
class Course {
public String name;
public int duration;
Course(String name, int duration) {
this.name = name;
this.duration = duration;
}
// Создаем без указания длительности
Course(String name) {
this.name = name;
}
}
// 18 часов
var course1 = new Course("Java", 18);
var course2 = new Course("PHP");
Про перегрузку конструктора полезно знать из-за частого использования в существующих классах, с которыми вам предстоит работать. Поэтому мы ее затрагиваем уже сейчас.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.