Vi har redan pratat om det faktum att klasser är komplexa datatyper. Låt oss nu prata lite om den andra sidan av klasser - hur klasser hanteras av Java-maskinen. Kom ihåg att i Java är allt ett objekt, till och med en klass. En klass är ett objekt. Förvånar det dig? Låt oss sedan fortsätta.

Laddar en klass i minnet

I själva verket, när en klass laddas in i minnet, skapas tre speciella "objekt":

Laddar en klass i minnet

Kort beskrivning av illustrationen:

Gul rektangel:

Kodfilen lagras på disken som en fil med filtillägget ".class". Den innehåller information om klassen, dess fält och metoder, såväl som källkoden för metoder som kompileras till bytecode.

Orange rektangel:

När Java-maskinen laddar en klass i minnet, kompilerar den bytekoden till maskinkod som är specifik för datorns processor och operativsystem. Endast Java-maskinen har tillgång till denna maskinkod. Som Java-programmerare har vi inte tillgång till det.

Grön rektangel:

Java-maskinen skapar ett objekt som innehåller alla statiska variabler och metoder för klassen. Du kommer åt detta "objekt" med hjälp av klassnamnet.

Till exempel när du skriver hänvisar du till den statiska variabeln som finns i klassen. Detta objekt är vår gröna rektangel. Och det är där den statiska variabeln lagras.java.lang.Math.PIPIjava.lang.Mathjava.lang.MathPI

Blå rektangel:

När Java-maskinen laddar koden för en klass i minnet, skapar den ett speciellt java.lang.Classobjekt, som lagrar information om den laddade klassen: dess namn, metodnamn, fältnamn och typer, etc.

Namnet "Klass" kan vara lite förvirrande. Det skulle vara mer meningsfullt att kalla det ClassInfo, eftersom den här klassen bara lagrar lite information om den laddade klassen.

Du kan hämta Class-objektet för vilken typ som helst med ett kommando så här:

Class name = ClassName.class;

Exempel:

Koda Notera
Class a = String.class;
Skaffa ett Classobjekt med information om Stringklassen
Class b = Object.class;
Skaffa ett Classobjekt med information om Objectklassen
Class c = Integer.class;
Skaffa ett Classobjekt med information om Integerklassen
Class d = int.class;
Skaffa ett Classobjekt med information om inttypen
Class e = void.class;
Skaffa ett Classobjekt med information om voidtypen

Du kan också få en referens till ett klassbeskrivningsobjekt från vilket objekt som helst, eftersom varje objekt har metoden getClass()som det ärver från Objectklassen.

Exempel:

Koda Notera
Class a = "Hello".getClass();
Samma objekt somString.class
Class b = new Integer().getClass();
Samma objekt somInteger.class
Class c = Boolean.TRUE.getClass();
Samma objekt somBoolean.class