Ми вже пояснювали, що класи — це складні типи даних. А тепер трохи поговоримо про обробку класів Java-машиною: у Java все є об'єктом, навіть клас. Клас — це об'єкт. Цікаво? Тоді йдемо далі.

Завантаження класу в пам'ять

Насправді під час завантаження класу в пам'ять створюються три спеціальних «об'єкти»:

Короткий опис малюнка

Жовтий прямокутник:

Файл із кодом має розширення імені «.class» і зберігається на диску. Він містить інформацію про клас, його поля й методи, а також код методів, скомпільований у байт-код.

Помаранчевий прямокутник:

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

Зелений прямокутник:

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

Наприклад, коли ви пишете java.lang.Math.PI, ви звертаєтеся до статичної змінної PI, що міститься в класі java.lang.Math. Саме цей клас java.lang.Math і показано на зеленому прямокутнику. І саме в ньому зберігається статична змінна PI.

Синій прямокутник:

Коли Java-машина завантажує код класу в пам'ять, вона створює спеціальний об'єкт типу java.lang.Class, в якому зберігається інформація про завантажений клас: його ім'я, імена методів, імена й типи полів тощо.

Назва «Class» може дещо збивати з пантелику. Логічніше було б назвати цей об'єкт ClassInfo: він лише зберігає певну інформацію про завантажений клас.

Отримати об'єкт класу можна для будь-якого типу за допомогою такої команди:

Class ім'я = Ім'яКласу.class;

Приклади:

Код Примітка
Class a = String.class;
Отримуємо об'єкт типу Class з інформацією про клас String
Class b = Object.class;
Отримуємо об'єкт типу Class з інформацією про клас Object
Class c = Integer.class;
Отримуємо об'єкт типу Class з інформацією про клас Integer
Class d = int.class;
Отримуємо об'єкт типу Class з інформацією про тип int
Class e = void.class;
Отримуємо об'єкт типу Class з інформацією про тип void

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

Приклади:

Код Примітка
Class a = "Привіт".getClass();
Той самий об'єкт, що й String.class
Class b = new Integer().getClass();
Той самий об'єкт, що й Integer.class
Class c = Boolean.TRUE.getClass();
Той самий об'єкт, що й Boolean.class