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 |
|
Створює об'єкт типу Scanner |
|
Створює об'єкт типу 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();
Ось що буде в пам'яті після виконання цього коду:

Тому сміливо передавайте ваші рядки в будь-які методи: ніхто їх не змінить.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ