JavaRush /Курси /Java Syntax Zero /Об'єкти і Конструктори

Об'єкти і Конструктори

Java Syntax Zero
Рівень 11 , Лекція 2
Відкрита

1. Створення об'єкта

От ми й дійшли до створення об'єктів. Ви вже стикалися з цим раніше, просто зараз ми розберемо цю тему детальніше. Насправді створювати об'єкти дуже просто.

Щоб створити об'єкт, потрібно використовувати оператор new. Виглядає створення об'єкта приблизно так:

new Клас(параметри)

Найчастіше, одразу після створення об'єкта, посилання на нього ми зберігаємо в змінну, яка теж дуже часто має такий самий тип, як і створений об'єкт. Тому зазвичай ви бачите код створення об'єкта, схожий на такий:

Клас імя = new Клас(параметри)

Де Клас імя — це створення нової змінної, а код справа від знака дорівнює — це створення нового об'єкта типу Клас.

Приклади:

Код Примітка
Object o = new Object();
Створення об'єкта типу Object
Cat pet = new Cat();
Створення об'єкта типу Cat
Scanner console = new Scanner(System.in);
Створення об'єкта типу Scanner

Дуже часто програмісти називають змінні таким самим ім'ям, що й класи, тільки з маленької літери. Програміста-початківця такий код може збити з пантелику:

Код
BufferedReader bufferedReader = new BufferedReader(reader);
Cat cat = new Cat();
PersonInfo personInfo = new PersonInfo();

Насправді в цьому коді немає нічого страшного — це найзвичайніший код, у якому створюється змінна і одразу ініціалізується об'єктом її ж типу.

Зліва від знака дорівнює — створення змінної. Справа — створення об'єкта. Все.

2. Конструктор

Ви, мабуть, часто бачили, що при створенні об'єкта в нього передаються якісь параметри. Причому в деякі об'єкти параметри передаються, а в деякі — ні. Як взагалі працює весь цей механізм з параметрами?

Тут теж все просто: у кожного класу є спеціальний метод (або методи), які відповідають за обробку параметрів при створенні об'єкта. Такі методи називаються конструктори. А один метод, відповідно, конструктор.

Відрізнити метод-конструктор від звичайного методу в коді нескладно. Такий метод має дві особливості:

  • ім'я методу-конструктора збігається з назвою його класу (і починається з великої літери)
  • метод-конструктор не має типу, який повертається.

Загальний вигляд його зазвичай такий:

модифікатори Клас(параметри)
{
   код
}

Приклад:

Код Примітка
public class Point
{
   public int x;
   public int y;

   Point(int x, int y)
   {
      this.x = x;
      this.y = y;
   }
}
Клас Point




Конструктор класу Point
public class Solution
{
   public static void main(String[] args)
   {
      Point point = new Point(5, 10);
   }
}




Створення об'єкта класу Point, буде викликаний конструктор класу.

Зверніть увагу, як виглядає метод-конструктор: у нього немає типу-результату і його ім'я збігається з ім'ям-класу.

І ще один момент: подивіться на код всередині конструктора. Змінні-параметри конструктора мають ті ж імена, що й поля класу – x, y. Це стандартна практика, щоб не вигадувати назви змінних. Беруться ті ж імена, що у полів класу, а конфлікт імен вирішується за допомогою ключового слова this.

3. Виклик конструктора

Коли ви створюєте новий об'єкт за допомогою оператора new і команди виду «new Клас(параметри)», відбуваються дві речі:

  • Java-машина створює об'єкт типу Клас
  • Java-машина викликає у об'єкта конструктор і передає туди ваші параметри

Ви як програміст самі вирішуєте, які у вашого класу мають бути конструктори, і які у цих конструкторів мають бути параметри.

Допустимо, ви вирішили створити клас для обліку котів у притулку для тварин. Тоді ваш клас Cat може мати такий вигляд:

class Cat
{
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
}
Cat cat = new Cat("Васька", 2);
Так можна
Cat cat = new Cat("Васька");
А так — не можна. Код не скомпілюється.
Cat cat = new Cat();
І так не можна. Код не скомпілюється.

У класу Cat всього один конструктор з параметрами name і age. Т.к. інших конструкторів немає, ви зобов'язані при створенні об'єкта передати в якості параметрів ім'я (name) і вік (age) кота. Ви не можете не передати параметри в конструктор.

4. Кілька конструкторів

Проте, якщо вам потрібно, ви можете додати в клас кілька конструкторів. Немає жодного обмеження на кількість конструкторів або їх параметрів. При створенні об'єкта компілятор сам підбере відповідний за параметрами конструктор

Код Примітка
class Cat
{
   public static final int UNKNOWN = -1;
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
   public Cat(String name)
   {
      this.name = name;
      this.age = UNKNOWN; // невідомо
   }
}
Cat cat = new Cat("Васька", 2);
Так можна: викличеться перший конструктор
Cat cat = new Cat("Васька");
Так можна: викличеться другий конструктор
Cat cat = new Cat();
А так — не можна. Код не скомпілюється.

Ми вирішили врахувати ситуацію, що вік кота може бути невідомий. Для цього випадку додали в код спеціальну константу — UNKNOWN і конструктор, який приймає лише один параметр — ім'я кота.

Зверніть увагу, що ми як і раніше ініціалізуємо обидві змінні-класу всередині обох конструкторів. Невідомі/відсутні параметри ми замінюємо на константу UNKNOWN.

Якщо змінній age не присвоїти жодного значення, вона буде зберігати значення за замовчуванням == 0. А адже знайденому на вулиці кошеняті цілком собі може бути 0 повних років. Тому нуль у змінній age зовсім не обов'язково означає «невідомий вік».

5. Конструктор за замовчуванням

Якщо ви хочете, щоб об'єкти вашого класу створювались без жодних параметрів, вам потрібно, щоб у вашого класу був оголошений конструктор без параметрів.

Конструктор без параметрів — це не обов'язково конструктор без коду, він цілком може містити код, який ініціалізує змінні класу стартовими значеннями:

Код Примітка
class Cat
{
   public static final int UNKNOWN = -1;
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }

   public Cat()
   {
      this.name = "Безіменний";
      this.age = UNKNOWN; // невідомо
   }
}
Cat cat = new Cat("Васька", 2);
Так можна: викличеться перший конструктор
Cat cat = new Cat();
Так можна: викличеться другий конструктор

Конструктор за замовчуванням

Є дуже важливий момент, який вам слід знати і пам'ятати.

Якщо у вашого класу взагалі немає жодного конструктора, компілятор додасть вам у клас конструктор-за-замовчуванням – конструктор без параметрів і коду, але з модифікатором public.

Проте, якщо у вашому класі є хоча б один конструктор, конструктор-за-замовчуванням вже додаватися не буде – вам потрібно буде дописати його самостійно.

Код Примітка
class Cat
{
   public String name;
   public int age;
}
Cat cat = new Cat();
Так можна: викличеться конструктор-за-замовчуванням

Коментарі (9)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Andrey Neres Рівень 5
22 липня 2025
(Ліворуч від знака рівності — створення змінної. Праворуч — створення об’єкта. І все.) Якщо бути точніше, то зліва створюється Посилання на об'єкт, а не змінна
Alex Рівень 2
2 вересня 2024
не викупаю цього:

Якщо змінній age не присвоїти жодного значення, вона буде зберігати значення за замовчуванням == 0. Але ж знайденому на вулиці кошеняті цілком може бути 0 повних років. Тому нуль у змінній age зовсім необов'язково означає «невідомий вік».
Як це, не присвоїти жодного значення змінній age? Мається на увазі на полях класу, де вона оголошується? Це ж немає сенсу, в любому випадку age буде або -1, або те, що ми передамо в конструкторі, а не викликати конструктор ми не можемо, і навіть в другому конструкторі age == -1, про що тоді мова, я не викупаю?

class Cat
{
   public static final int UNKNOWN = -1;
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
   public Cat(String name)
   {
      this.name = name;
      this.age = UNKNOWN; // невідомо
   }
}
14 квітня 2025
Щоб можно було ініціалізувати котів з нульовим віком, а не за замовчуванням давати всім котам age=0 і передаємо UNKNOWN = -1 при виклику конструктора.
Олег Рівень 111 Expert
15 квітня 2023
Лекція супер! Задачки на одному диханні вирішуються!
Roma Chernesh Рівень 16
5 січня 2023
Після останньої супер-легкої лекції, ці елементарні задачки навіть складними здалися:)
Саша Рівень 30
13 жовтня 2022
в першій задачі використовуйте print замвсть println
Andriy Рівень 16
24 жовтня 2022
З println також рішення проходить.
gummer Рівень 11
14 березня 2024
Можна і print, і println Головне аби він був не в мейні, а в конструкторі :) Сам на цьому попалився
Anonymous #696530 Рівень 19
25 серпня 2022
Добре зайшла ця лекція, все зрозуміло