Вече говорихме за факта, че класовете са сложни типове данни. Сега нека поговорим малко за другата страна на класовете - How класовете се обработват от Java машината. Не забравяйте, че в Java всичко е обект, дори клас. Класът е обект. Това учудва ли ви? Тогава да продължим.

Зареждане на клас в паметта

Всъщност, когато клас се зареди в паметта, се създават три специални "обекта":

Зареждане на клас в паметта

Кратко описание на илюстрацията:

Жълт правоъгълник:

Кодовият файл се съхранява на диска като файл с разширение ".class". Той съдържа информация за класа, неговите полета и методи, Howто и изходния code на методите, компorран в byte code.

Оранжев правоъгълник:

Когато Java машината зареди клас в паметта, тя компorра byte codeа в машинен code, специфичен за процесора и операционната система на компютъра. Само Java машината има достъп до този машинен code. Като Java програмисти, ние нямаме достъп до него.

Зелен правоъгълник:

Java машината създава обект, който съдържа всички статични променливи и методи на класа. Имате достъп до този "обект", като използвате името на класа.

Например, когато пишете , вие се позовавате на статичната променлива, разположена в класа. Този обект е нашият зелен правоъгълник. И това е мястото, където се съхранява статичната променлива.java.lang.Math.PIPIjava.lang.Mathjava.lang.MathPI

Син правоъгълник:

Когато Java машината зареди codeа на даден клас в паметта, тя създава специален java.lang.Classобект, който съхранява информация за заредения клас: неговото име, имена на методи, имена и типове на полета и т.н.

Името "Клас" може да бъде малко объркващо. Би било по-логично да го наречем ClassInfo, тъй като този клас просто съхранява няHowва информация за заредения клас.

Можете да получите обекта Class за всеки тип, като използвате команда като тази:

Class name = ClassName.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 = "Hello".getClass();
Същият обект катоString.class
Class b = new Integer().getClass();
Същият обект катоInteger.class
Class c = Boolean.TRUE.getClass();
Същият обект катоBoolean.class