1. Об'єкти

У мові Java все є об'єктами.

Точніше, мало що в Java не є об'єктом. Наприклад, примітивні типи. Проте це скоріше виняток, аніж правило.

Що ж таке об'єкт?

Об'єкт — це дані й методи, згруповані разом для обробки цих даних. Коли ми говоримо про дані, звичайно, маємо на увазі змінні.

Про змінні об'єкта кажуть, що це «дані об'єкта» або «стан об'єкта».

Про методи об'єкта кажуть, що це «поведінка об'єкта». Стан об'єкта (змінні об'єкта), зазвичай змінюють лише за допомогою методів того самого об'єкта. Змінювати змінні об'єкта безпосередньо (не через методи об'єкта) вважається поганим тоном.

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

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

Взаємодія з об'єктом

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

змінна.метод()

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

Для того щоб звернутися до поля (змінної) об'єкта, також потрібно використовувати оператор «крапка»:

змінна.поле

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


2. Оператор new

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

Клас змінна = new Клас(параметри);

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

Які саме параметри матиме об'єкт, вирішують програмісти, які створюють клас об'єкта.

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

Scanner console = new Scanner(System.in);
int x = console.nextInt();

Scanner console — це створення змінної console типу Scanner. new Scanner(System.in) — це створення об'єкта типу Scanner. А оператор присвоювання записує в змінну console посилання на новостворений об'єкт.

У другому рядку ми викликаємо метод nextInt() для об'єкта Scanner за допомогою змінної console, яка зберігає посилання на об'єкт типу Scanner.

Приклади створення об'єктів:

Код Опис
String s = new String("Привіт");
Створює об'єкт типу String
Scanner console = new Scanner("");
Створює об'єкт типу Scanner
int[] data = new int[10];
Створює об'єкт типу int[]: контейнер на 10 елементів типу int

Створений об'єкт називають об'єктом класу або екземпляром класу, а клас — класом об'єкта. Наприклад: змінна s зберігає посилання на екземпляр класу String.


9
Задача
Модуль 1. Java Syntax,  14 рівень1 лекція
Недоступна
Конвертер рядка
У методі main перетвори рядок string на тип double за допомогою статичного методу parseDouble класу Double. Потім округли отримане значення за допомогою статичного методу round класу Math. Результат виведи на екран.

3. Знайомство з класами

Ви вже, напевно, переконалися, що використовувати класи, створені іншими програмістами, дуже зручно. А як щодо створення власних класів?

Як зрозуміти, коли і де потрібен власний клас? І як його створити?

Програмісти зазвичай створюють свої класи, коли хочуть увести в програму нову сутність. Незрозуміло? Тоді спробую пояснити, але почну здалеку.

Групування даних

Якщо трохи спростити, можна сказати, що об'єкт у Java — це область пам'яті, яка містить оголошені в класі змінні (поля класу). Або інакше — змінні, об'єднані в групи.

Припустімо, ваша програма має зберігати координати 100 точок і метод для їх виведення на екран. Це можна зробити за допомогою масивів. Наприклад, отак:

class Solution
{
   public static void printPoints(int[] x, int[] y, int[] color)
   {
     for (int i = 0; i < x.length; i++)
       System.out.println("Колір точки x=" + x[i] + ", y=" + y[i] + " " + color[i]);
   }

   public static void main(String[] args)
   {
     int[] x = new int[100];
     int[] y = new int[100];
     int[] color = new int[100];
     printPoints(x, y, color);
   }
}

Було б набагато зручніше, якби ми відразу мали тип для зберігання всієї інформації про кожну точку: x, y, колір. А якщо в Java такого типу немає, можна його створити власноруч.

Для цього напишемо код створення класу Point:

public class Point
{
   public int x;
   public int y;
   public int color;
}

Тоді попередній код можна переписати отак:

class Solution
{
   public static void printPoints(Point[] points)
   {
     for (int i = 0; i < points.length; i++)
       System.out.println("Колір точки x=" + points[i].x + ", y=" + points[i].y + " " + points[i].color);
   }

   public static void main(String[] args)
   {
     Point[] data = new Point[100];
     for (int i = 0; i < data.length; i++)
       data[i] = new Point();
     printPoints(data);
   }
}

А тепер додамо в клас Point метод, який виводитиме інформацію про об'єкт:

public class Point
{
   public int x;
   public int y;
   public int color;
   public void print()
   {
     System.out.println("Колір точки x=" + x + ", y=" + y + " " + color);
   }
}

Тоді клас Solution матиме такий вигляд:

class Solution
{
   public static void printPoints(Point[] points)
   {
     for (int i = 0; i < points.length; i++)
       points[i].print();
   }

   public static void main(String[] args)
   {
     Point[] data = new Point[100];
     for (int i = 0; i < data.length; i++)
       data[i] = new Point();
     printPoints(data);
   }
}

Ми красиво сховали всередину точки (клас Point) інформацію про її координати й метод, який виводить дані про стан об'єкта-точки на екран.

Класи — це відповідь на зростання складності програм. Велика програма стає простішою, якщо її розділити на багато маленьких класів.


4. Об'єкти Mutable та Immutable

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

У відповідь на цю проблему в Java придумали об'єкти-константи. Їх ще називають immutable-об'єкти — незмінні об'єкти.

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

По-перше, всі змінні класу String приховано — їх оголошено як private.

По-друге, успадкування від класу String неможливе: оголошення класу містить модифікатор final.

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

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

String text = "Це дуже важливе повідомлення";
String message = text.toUpperCase();

От що буде в пам'яті після виконання цього коду:

Отже, можна сміливо передавати свої рядки в будь-які методи — їх ніхто не змінить.