Класи. Застосування класів у програмах на Java. Визначення класу та об’єкту класу. Приклади

Класи. Застосування класів у програмах на Java. Визначення класу та об’єкту класу. Приклади


Зміст


1. Для чого у програмах використовуються класи?

 У мові програмування Java розробка усіх програм базується на об’єктно-орієнтованому підході. Можна сказати, що Java – це строго об’єктно-орієнтована мова програмування. В основі об’єктно-орієнтованого програмування лежать поняття “клас” та “об’єкт”. Програміст, що розробляє програму на основі об’єктно-орієнтованого підходу, повинен вміти виділяти у проблемній області (задачі) логічно-завершені одиниці. Кожна логічно завершена одиниця має бути реалізована як деякий клас. В цілому, при програмуванні задач з використанням об’єктно-орієнтованої парадигми, програміст повинен вміти:

  • структурувати задачу на завершені логічні одиниці, що можуть бути реалізовані окремими класами;
  • правильно визначати та будувати взаємозв’язки між різними класами у програмі;
  • помічати багатократно використовуваний програмний код, що може повторюватись у різних частинах програми та правильно виділяти цей код окремим кодом;
  • будувати ієрархію між класами за принципом “від простого до складного”;
  • розуміти деталі реалізації різноманітних можливостей, що дає використання класів для ефективної побудови програм (інкапсуляція, спадковість, поліморфізм).

 

2. Визначення класу. Загальна форма оголошення класу. Ключове слово class

З точки зору програмування, клас – це набір даних класу та методів класу. Методи оперують цими даними класу (виконують роботу над даними класу). З допомогою множини методів класу формується логічно-завершений програмний код, що оперує даними класу.

При використанні класів у програмах виділяються дві складові:

  • оголошення класу як окремого складного типу даних;
  • реалізація об’єкту (змінної) цього класу.

Оголошення класу – це оголошення нового складного типу даних. Цей тип даних містить методи обробки цих даних.

Оголошення класу починається з ключового слова class. У найпростішому випадку загальна форма оголошення класу:

class ClassName
{
    type variable1;
    type variable2;
    ...
    type variableN;

    type method1(parameters1)
    {
        // ...
    }

    type method2(parameters2)
    {
        // ...
    }

    ...

    type methodN(parametersN)
    {
        // ...
    }
};

де

  • type – деякий тип даних. Це може бути примітивний (базовий) тип даних або складний тип даних, наприклад деякий клас;
  • variable1, variable2, …, variableN – змінні екземпляру класу;
  • method1, method2, …, methodN – методи класу;
  • parameters1, parameters2, parametersN – параметри, що відповідно отримують методи класу method1, method2, methodN.

 

3. Що таке об’єкт класу? Загальна форма оголошення об’єкту класу. Оператор new

Об’єкт класу – це оголошення змінної. Тип змінної – це є тип з іменем класу. При оголошенні об’єкту класу створюється екземпляр класу. Поняття “об’єкт класу” та “екземпляр класу” можна вважати синонімами.

Загальний вигляд оголошення об’єкту класу в мові Java:

ClassName ObjName = new ClassName();

де

  • ClassName – ім’я класу
  • ObjName – ім’я об’єкту (змінної) класу.

Можливий й інший варіант оголошення об’єкту класу:

ClassName ObjName;
ObjName = new ClassName();

Після вищенаведених оголошень, змінна ObjName містить адресу пам’яті конкретного об’єкта типу ClassName.

У мові Java створення об’єкту класу відбувається у 2 етапи:

  • спочатку оголошується змінна (об’єкт) типу клас. Ця змінна ще не визначає об’єкт. Вона є змінною, яка може посилатись на об’єкт;
  • створюється конкретна фізична копія об’єкту, яка присвоюється цій змінній типу клас. Це здійснюється з допомогою оператора new.

 

4. Яка відмінність між поняттями “клас” та “об’єкт класу”?

Клас – це тільки інформація про новий складений тип даних. Фактично, клас описує формат даних. Оголошення класу носить декларативний характер. Ім’я класу є унікальним у всій програмі.

Об’єкт класу – це конкретний екземпляр класу, в якому дані класу мають деякі заповнені значення. На відміну від оголошення (декларування) класу, для об’єкту класу виділяється пам’ять. Об’єктів того самого класу може бути декілька.

 



5. Приклади оголошення та використання простих класів, що містять дані та методи їх обробки

Приклад 1. Клас Circle, що реалізує геометричну фігуру коло. У класі оголошуються:

  • три приховані (private) змінні (члени даних) класу з іменами x, y, r. Ці змінні визначають координату центру кола та його радіус;
  • чотири методи SetXYR(), GetX(), GetY(), GetR(). Ці методи є загальнодоступними (public). За замовчуванням, методи і змінні у класах на мові Java є загальнодоступними, якщо перед ними немає ключового слова private. Тому ці чотири методи є видимі за межами класу.
public class Circle
{
    private int x, y; // координати центру кола
    private int r; // радіус кола

    // метод класу, що встановлює нові значення x,y,r
    void SetXYR(int nx, int ny, int nr)
    {
        x = nx;
        y = ny;
        r = nr;
    }

    // методи класу, що повертають значення
    int GetX()
    {
        return x;
    }

    int GetY()
    {
        return y;
    }

    int GetR()
    {
        return r;
    }
}

Використання класу в іншому методі

// оголосити змінну типу Circle
Circle c1 = new Circle(); // c1 - об'єкт класу Circle, виділення пам'яті

c1.SetXYR(3, 5, 2); // викликати метод, що встановлює нові x, y, r

// перевірка
int d;
d = c1.GetX(); // d = 3, виклик методу GetX() класу
d = c1.GetR(); // d = 2

У вищенаведеному коді оголошується об’єкт (екземпляр) класу з іменем c1. Пам’ять для об’єкту c1 виділяється з допомогою оператора new. Операція виділення пам’яті оператором new є обов’язковою (на відміну від мови C++).

Далі викликаються загальнодоступні (public) методи класу Circle.

Приклад 2. Клас MyName, що реалізує прізвище, ім’я та по-батькові особи.

У класі оголошується:

  • 3 змінні-екземпляри класу з іменами name, surname, patr;
  • 7 методів класу з іменами GetName(), GetSurname(), GetPatr(), SetName(), SetSurname(), SetPatr(), SetMyName().
// оголошення класу MyName
class MyName
{
    // змінні-екземпряри класу MyName
    String name; // Прізвище
    String surname; // ім'я
    String patr; // по-батькові

    // методи класу
    String GetName() { return name;      }
    String GetSurname() { return surname; }
    String GetPatr() { return patr; }
    void SetName(String nName) { name = nName; }
    void SetSurname(String nSurname) { surname = nSurname; }
    void SetPatr(String nPatr) { patr = nPatr; }

    void SetMyName(String nName, String nSurname, String nPatr)
    {
        name = nName;
        surname = nSurname;
        patr = nPatr;
    }
}

Використання класу MyName в іншому методі або програмному коді

...

// використання класу MyName в деякому методі
// створення об'єкту (екземпляру) класу з іменем nm1
MyName nm1 = new MyName();

// створення об'єкту (екземпляру) класу з іменем nm2
MyName nm2;
nm2 = new MyName();

String s;

// виклик методів класу з об'єкту nm1
nm1.SetName("Johnson");
nm1.SetSurname("John");
nm1.SetPatr("");

s = nm1.GetSurname(); // s = "John"

// виклик методів класу з об'єкту класу
nm2.SetMyName("David", "Albright", "");
s = nm2.GetName(); // s = "David"

nm2.name = "Michael"; // так теж можна
s = nm2.GetName(); // s = "Michael"

...

 

6. Який тип доступу (private, public) мають члени класу за замовчуванням?

За замовчуванням, члени класу мають тип доступу public. Вони є загальнодоступними.

 

7. Що таке класи-“обгортки”? Яке призначення класів-“обгорток”? Приклад

Класи-обгортки призначені для представлення примітивних типів у вигляді об’єктів. Тобто, вони здійснюють перетворення примітивного типу у тип-посилання. Для кожного примітивного типу існує свій власний клас (тип) упаковування.

Нижче наводиться перелік відповідностей примітивного типу та типу (класу) упаковування:

boolean => Boolean
char    => Character
byte    => Byte
short   => Short
int     => Integer
long    => Long
float   => Float
double  => Double
void    => Void

Наприклад. Нижче наведено приклади перетворення різних примітивних типів у типи-упаковування і навпаки

// перетворення типів int <=> Integer 
int d = 25;
Integer D = new Integer(d); // D = 25

D = new Integer(38);
d = D.intValue(); // d = 38


// перетворення типів float <=> Float
float f = 3.85f;
Float F = new Float(f); // F = 3.85 

F = new Float(7.77f); 
f = F.floatValue(); // f = 7.77


// перетворення типів char <=> Character
char c = 'A';
Character C = new Character(c); // C = 'A'

C = new Character('Z');
c = C.charValue(); // c = 'Z'

 


Зв’язані теми