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

Об'єкти в Java

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

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.



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 vs Immutable об'єкти

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

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

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

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

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

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

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

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

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

Mutable vs Immutable об'єкти

Тому сміливо передавайте ваші рядки в будь-які методи: ніхто їх не змінить.


Коментарі (15)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Василь Рівень 4
24 липня 2023
тошнотики, об'єкти String та int[ ] не дали створити циклом, щоб не писати по кілька разів. Валідатор не пропускав
12 травня 2023
Думала зі мною щось не так, що я не можу зрозуміти цю лекцію, але зайшла в коментарі і стало легше)
Mykola Рівень 15 Expert
6 серпня 2023
Як зараз навчання?
7 серпня 2023
Буває, що застрягаю на темі і не йде ніяк, але потрохи рухаюсь. Головне не тиснути на себе, бо вигорання то є найгірша штука)
Dmytrii Рівень 28
23 червня 2024
выгорела?)
11 червня 2025
ні, просто при навчанні в університеті java робиться новий акаунт
les_yeux_blancs Рівень 50
21 квітня 2023
"Java такого типу немає, можна його створити власноруч" тут має бути "не має"
Зепп Бранниган Рівень 41 Moderator
21 квітня 2023
У реченні "А якщо в Java такого типу немає, можна його створити власноруч" використано заперечне слово немає (його можна замінити формою нема), у якому не пишеться разом.
Alexoria Рівень 12
8 січня 2023
рекомендую глянути канал alishev саме про об'єкти в java, там наглядно на коді пояснюють це все тому що мені дуже важко візуалізовувати всю цю інформацію, без прикладів коду або картинок
volodymyr_hr Рівень 16
15 травня 2023
погоджуюсь, після перегляду все стало на свої місця
Віктор Рівень 10
5 вересня 2022
Важкувата тема,але надіюсь далі все зрозумію
Владислав Рівень 22 Expert
6 серпня 2022
Всим, хто ще не здався - Удачі) А я йду далі)
Me Lex Рівень 12
18 березня 2022
Трошки важкувату треба 3-4 рази передивлятись ) Але потім наче доходить по-трохи ...
IvanPozdniakov Рівень 13
4 грудня 2022
Дякую за такі коменти , типу важкувато. Бо я вже думаю що я тугодум перечитуючи матеріал по три рази)))
Roma Chernesh Рівень 16
19 грудня 2022
Ото і з 10ого разу мені не завжди все зрозуміло:)