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();
Так можна: буде викликано конструктор-за-замовчуванням