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.PI
PI
java.lang.Math
java.lang.Math
PI
Rettangolo blu:
Quando la macchina Java carica in memoria il codice di una classe, crea un java.lang.Class
oggetto 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 Class oggetto con informazioni sulla String classe |
|
Ottenere un Class oggetto con informazioni sulla Object classe |
|
Ottenere un Class oggetto con informazioni sulla Integer classe |
|
Ottenere un Class oggetto con informazioni sul int tipo |
|
Ottenere un Class oggetto con informazioni sul void tipo |
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 Object
classe.
Esempi:
Codice | Nota |
---|---|
|
Stesso oggetto diString.class |
|
Stesso oggetto diInteger.class |
|
Stesso oggetto diBoolean.class |
GO TO FULL VERSION