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:
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 |
|---|---|
|
Ottenere un Classoggetto con informazioni sulla Stringclasse |
|
Ottenere un Classoggetto con informazioni sulla Objectclasse |
|
Ottenere un Classoggetto con informazioni sulla Integerclasse |
|
Ottenere un Classoggetto con informazioni sul inttipo |
|
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 |
|---|---|
|
Stesso oggetto diString.class |
|
Stesso oggetto diInteger.class |
|
Stesso oggetto diBoolean.class |
GO TO FULL VERSION