Конструктор в Java и ключевое слово this- введение в Java-OOP 003 #
Создание объектов в Java часто сравнивает с обычной стройкой в жизни. И английский constructor и русский конструктор связаны со строительством напрямую.
Принципиально, конструктор - это просто метод. Просто метод который создаёт объекты. В связи с тем, что это очень важный метод и является краеугольным камнем всей парадигмы ООП, то у этого метода есть привилегия.
Конструкторы (методы по которым создаются объекты) - пишутся в java всегда с большой буквы.
Это помогает понять, что сейчас создаётся объект.
Несмотря на его маленькие отличия это всего лишь метод. Метод с помощью которого мы можем создать объект.
В некоторых ситуациях нам достаточно создать пустой объект, без всяких полей, в других нам нужны объекты с параметрами.
Например, мы не можем общаться с пользователем сайта, не зная его емайла и ника. Если мы говорим о базе данных школы, то мы не можем “создать ученика” без имени, фамилии, года рождения и возможно без документа(номера документа) подтверждающего личность это тоже не всегда возможно.
Ситуации и в жизни и в коде могут встретиться разные и потому мы можем встретить в ином классе целое семейство конструктов. На сайте существуют различные страницы. На некоторых есть фотография, на некоторых нет. Для создания различных объектов одного типа используют разные конструкторы.
Иногда в классе нет вообще ни одного конструктора. Именно с такого примера мы и начнём.
Объект есть, конструктора нет #
На нашем (условном) сайте есть статьи и мы создаём Article класс, который поможет нам с ними работать.
public class Article {
}
class Test {
public static void main(String[] args) {
Article art = new Article();
}
}
Мы можем создать тестовый класс в том же файле. Мы должны знать, что модификатор доступа Public может применятся только к тому классу, который назван так же как и файл. Дополнительный класс в нашем файле скорее вспомогательный. Этим правилом мы и воспользовались для простоты.
При создании объекта мы использовали пустой конструктор, конструктор без параметров. Но мы его не создавали в классе Article. Так откуда же он взялся?
Java создаёт один стандартный пустой конструктор сразу по умолчанию в каждом классе. Нам не обязательно прописывать пустой конструктор. Но как только мы прописываем хоть одно правило создания экземпляра объекта, то мы переписываем стандартное поведение Java. И если нам всё ещё нужен пустой конструктор, то мы должны его прописать самостоятельно.
Конструктор - это специальный метод, не имеющий возвратного значения. Этот метод называется так же как и класс экземпляр которого он должен создать.
В конструкторе мы можем указать начальные или стандартные значения будущих объектов.
public class Article {
String title;
String announce;
String fullText;
public Article() {
title = "unknown";
announce = "unknown";
fullText = "unknown";
}
}
Для чего нужно создавать много разных конструкторов? #
Много конструкторов обычно и не нужно. В рамках обучения можно создать несколько разных вариантов, в обычной жизни делают ровно столько, сколько используется другими частями программы. Чаще всего ровно один.
public class Book {
private String title;
private String author;
private String isbn;
private int page;
private int year;
public Book() {
}
public Book(String bookTitle, String bookAuthor, int bookYear) {
title = bookTitle;
author = bookAuthor;
year = bookYear;
}
public Book(String bookTitle, String bookAuthor, String bookIsbn, int bookPage) {
title = bookTitle;
author = bookAuthor;
isbn = bookIsbn;
page = bookPage;
}
}
this #
This это ссылка на самого себя, на класс, по которому создаются объекты.
Простейшее применение this уместно в классе выше. Что бы не придумывать новые переменные для конструкторов, отличающиеся от переменных класса, но созвучные им. Мы используем this и как бы говорим: " ЭТА переменная из ПОЛЯ КЛАССА будет равна тому значению, которое мы получим из переменной в сигнатуре конструктора."
public Book(String title, String author, int year) {
this.title = title;
this.author = author;
this.year = year;
}
public Book(String title, String author, String isbn, int page) {
this.title = title;
this.author = author;
this.isbn = isbn;
this.page = page;
}
Другой пример использования this указан в официальной документации и я просто попытаюсь прочитать его для вам.
public class Rectangle {
private int x, y;
private int width, height;
public Rectangle() {
this(0, 0, 1, 1);
}
public Rectangle(int width, int height) {
this(0, 0, width, height);
}
public Rectangle(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
...
}
Строчка “this(0, 0, 1, 1);” указывает на конструктор в этом же методе. И такой конструктор, которые принимает 4 параметра есть - “public Rectangle(int x, int y, int width, int height)”. Вот этот this и вызывает СОБСТВЕННЫЙ конструктор.
Дополнительные ссылки #
- Providing Constructors for Your Classes - официальная документация
- A Guide to Constructors in Java - www.baeldung.com/java-constructors
- Guide to the this Java Keyword this от baeldung
- Using the this Keyword - от Oracle
Домашнее задание #
- Сколько различных конструкторов можно создать, если у нас девять различных полей класса? Допустим int, double, String, char, long, float, byte, short, boolean.