Abbiamo già parlato del fatto che le classi sono tipi di dati complessi. Ora parliamo un po' dell'altro aspetto delle classi: come le classi vengono gestite dalla macchina Java. Ricorda che in Java tutto è un oggetto, anche una classe. Una classe è un oggetto. Ti sorprende? Allora andiamo avanti.

Caricamento di una classe in memoria

In realtà, quando una classe viene caricata in memoria, vengono creati tre "oggetti" speciali:

Caricamento di una classe in memoria

Breve descrizione dell'illustrazione:

Rettangolo giallo:

Il file di codice viene memorizzato su disco come file con estensione ".class". Contiene informazioni sulla classe, i suoi campi e metodi, così come il codice sorgente dei metodi compilati in bytecode.

Rettangolo arancione:

Quando la macchina Java carica una classe in memoria, compila il bytecode in codice macchina specifico per il processore e il sistema operativo del computer. Solo la macchina Java ha accesso a questo codice macchina. Come programmatori Java, non abbiamo accesso ad esso.

Rettangolo verde:

La macchina Java crea un oggetto che contiene tutte le variabili statiche ei metodi della classe. Si accede a questo "oggetto" utilizzando il nome della classe.

Ad esempio, quando scrivi , ti riferisci alla variabile statica che si trova nella classe. Questo oggetto è il nostro rettangolo verde. Ed è qui che viene memorizzata la variabile statica.java.lang.Math.PIPIjava.lang.Mathjava.lang.MathPI

Rettangolo blu:

Quando la macchina Java carica in memoria il codice di una classe, crea un java.lang.Classoggetto speciale, che memorizza le informazioni sulla classe caricata: il suo nome, i nomi dei metodi, i nomi dei campi e i tipi, ecc.

Il nome "Classe" può creare un po' di confusione. Avrebbe più senso chiamarlo ClassInfo, poiché questa classe memorizza solo alcune informazioni sulla classe caricata.

Puoi ottenere l'oggetto Class per qualsiasi tipo usando un comando come questo:

Class name = ClassName.class;

Esempi:

Codice Nota
Class a = String.class;
Ottenere un Classoggetto con informazioni sulla Stringclasse
Class b = Object.class;
Ottenere un Classoggetto con informazioni sulla Objectclasse
Class c = Integer.class;
Ottenere un Classoggetto con informazioni sulla Integerclasse
Class d = int.class;
Ottenere un Classoggetto con informazioni sul inttipo
Class e = void.class;
Ottenere un Classoggetto con informazioni sul voidtipo

Puoi anche ottenere un riferimento a un oggetto di descrizione della classe da qualsiasi oggetto, poiché ogni oggetto ha il getClass()metodo, che eredita dalla Objectclasse.

Esempi:

Codice Nota
Class a = "Hello".getClass();
Stesso oggetto diString.class
Class b = new Integer().getClass();
Stesso oggetto diInteger.class
Class c = Boolean.TRUE.getClass();
Stesso oggetto diBoolean.class