We hebben het al gehad over het feit dat klassen complexe gegevenstypen zijn. Laten we het nu hebben over de andere kant van klassen — hoe klassen worden afgehandeld door de Java-machine. Onthoud dat in Java alles een object is, zelfs een klasse. Een klasse is een object. Verrast dat je? Laten we dan doorgaan.

Een klas in het geheugen laden

Wanneer een klasse in het geheugen wordt geladen, worden in feite drie speciale "objecten" gemaakt:

Een klas in het geheugen laden

Korte beschrijving van de illustratie:

Gele rechthoek:

Het codebestand wordt op schijf opgeslagen als een bestand met de extensie ".class". Het bevat informatie over de klasse, de velden en methoden, evenals de broncode van methoden die in bytecode zijn gecompileerd.

Oranje rechthoek:

Wanneer de Java-machine een klasse in het geheugen laadt, compileert het de bytecode in machinecode die specifiek is voor de processor en het besturingssysteem van de computer. Alleen de Java-machine heeft toegang tot deze machinecode. Als Java-programmeurs hebben we er geen toegang toe.

Groene rechthoek:

De Java-machine maakt een object dat alle statische variabelen en methoden van de klasse bevat. U krijgt toegang tot dit "object" met behulp van de klassenaam.

Wanneer u bijvoorbeeld schrijft , verwijst u naar de statische variabele die zich in de klasse bevindt. Dit object is onze groene rechthoek. En daar wordt de statische variabele opgeslagen.java.lang.Math.PIPIjava.lang.Mathjava.lang.MathPI

Blauwe rechthoek:

Wanneer de Java-machine de code van een klasse in het geheugen laadt, maakt deze een speciaal java.lang.Classobject aan waarin informatie over de geladen klasse wordt opgeslagen: de naam, methodenamen, veldnamen en typen, enz.

De naam "Klasse" kan een beetje verwarrend zijn. Het zou logischer zijn om het ClassInfo te noemen, aangezien deze klasse alleen wat informatie over de geladen klasse opslaat.

U kunt het Class-object voor elk type verkrijgen met een opdracht als deze:

Class name = ClassName.class;

Voorbeelden:

Code Opmerking
Class a = String.class;
Verkrijg een Classobject met informatie over de Stringklasse
Class b = Object.class;
Verkrijg een Classobject met informatie over de Objectklasse
Class c = Integer.class;
Verkrijg een Classobject met informatie over de Integerklasse
Class d = int.class;
Verkrijg een Classobject met informatie over het inttype
Class e = void.class;
Verkrijg een Classobject met informatie over het voidtype

U kunt ook een verwijzing naar een klassebeschrijvingsobject krijgen van elk object, aangezien elk object de getClass()methode heeft die het overerft van de Objectklasse.

Voorbeelden:

Code Opmerking
Class a = "Hello".getClass();
Zelfde voorwerp alsString.class
Class b = new Integer().getClass();
Zelfde voorwerp alsInteger.class
Class c = Boolean.TRUE.getClass();
Zelfde voorwerp alsBoolean.class