Vi har allerede talt om, at klasser er komplekse datatyper. Lad os nu tale lidt om den anden side af klasser - hvordan klasser håndteres af Java-maskinen. Husk, at i Java er alt et objekt, selv en klasse. En klasse er et objekt. Overrasker det dig? Så lad os fortsætte.

Indlæser en klasse i hukommelsen

Faktisk, når en klasse indlæses i hukommelsen, oprettes tre specielle "objekter":

Indlæser en klasse i hukommelsen

Kort beskrivelse af illustrationen:

Gul rektangel:

Kodefilen gemmes på disken som en fil med filtypenavnet ".class". Den indeholder information om klassen, dens felter og metoder samt kildekoden for metoder, der er kompileret til bytekode.

Orange rektangel:

Når Java-maskinen indlæser en klasse i hukommelsen, kompilerer den bytekoden til maskinkode, der er specifik for computerens processor og operativsystem. Kun Java-maskinen har adgang til denne maskinkode. Som Java-programmører har vi ikke adgang til det.

Grønt rektangel:

Java-maskinen opretter et objekt, der indeholder alle klassens statiske variabler og metoder. Du får adgang til dette "objekt" ved hjælp af klassenavnet.

For eksempel, når du skriver , refererer du til den statiske variabel, der er placeret i klassen. Dette objekt er vores grønne rektangel. Og det er her den statiske variabel er gemt.java.lang.Math.PIPIjava.lang.Mathjava.lang.MathPI

Blå rektangel:

Når Java-maskinen indlæser koden for en klasse i hukommelsen, opretter den et særligt java.lang.Classobjekt, som gemmer information om den indlæste klasse: dens navn, metodenavne, feltnavne og typer osv.

Navnet "Klasse" kan være lidt forvirrende. Det ville give mere mening at kalde det ClassInfo, da denne klasse blot gemmer nogle oplysninger om den indlæste klasse.

Du kan få klasseobjektet for enhver type ved at bruge en kommando som denne:

Class name = ClassName.class;

Eksempler:

Kode Bemærk
Class a = String.class;
Få et Classobjekt med information om Stringklassen
Class b = Object.class;
Få et Classobjekt med information om Objectklassen
Class c = Integer.class;
Få et Classobjekt med information om Integerklassen
Class d = int.class;
Få et Classobjekt med information om inttypen
Class e = void.class;
Få et Classobjekt med information om voidtypen

Du kan også få en reference til et klassebeskrivelsesobjekt fra ethvert objekt, da hvert objekt har den getClass()metode, som det arver fra Objectklassen.

Eksempler:

Kode Bemærk
Class a = "Hello".getClass();
Samme objekt somString.class
Class b = new Integer().getClass();
Samme objekt somInteger.class
Class c = Boolean.TRUE.getClass();
Samme objekt somBoolean.class