Vi har allerede snakket om det faktum at klasser er komplekse datatyper. La oss nå snakke litt om den andre siden av klasser - hvordan klasser håndteres av Java-maskinen. Husk at i Java er alt et objekt, til og med en klasse. En klasse er et objekt. Overrasker det deg? Så la oss fortsette.

Laster en klasse inn i minnet

Faktisk, når en klasse lastes inn i minnet, opprettes tre spesielle "objekter":

Laster en klasse inn i minnet

Kort beskrivelse av illustrasjonen:

Gult rektangel:

Kodefilen lagres på disken som en fil med filtypen ".class". Den inneholder informasjon om klassen, dens felt og metoder, samt kildekoden til metoder som er kompilert til bytekode.

Oransje rektangel:

Når Java-maskinen laster en klasse inn i minnet, kompilerer den bytekoden til maskinkode spesifikk for datamaskinens prosessor og operativsystem. Bare Java-maskinen har tilgang til denne maskinkoden. Som Java-programmerere har vi ikke tilgang til det.

Grønt rektangel:

Java-maskinen lager et objekt som inneholder alle de statiske variablene og metodene i klassen. Du får tilgang til dette "objektet" ved å bruke klassenavnet.

For eksempel, når du skriver refererer du til den statiske variabelen som ligger i klassen. Dette objektet er vårt grønne rektangel. Og det er der den statiske variabelen er lagret.java.lang.Math.PIPIjava.lang.Mathjava.lang.MathPI

Blått rektangel:

Når Java-maskinen laster koden til en klasse inn i minnet, lager den et spesielt java.lang.Classobjekt, som lagrer informasjon om den lastede klassen: dens navn, metodenavn, feltnavn og typer, etc.

Navnet "Klasse" kan være litt forvirrende. Det ville være mer fornuftig å kalle det ClassInfo, siden denne klassen bare lagrer litt informasjon om den innlastede klassen.

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

Class name = ClassName.class;

Eksempler:

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

Du kan også få en referanse til et klassebeskrivelsesobjekt fra ethvert objekt, siden hvert objekt har metoden getClass()som det arver fra Objectklassen.

Eksempler:

Kode Merk
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