Java proibisce l'utilizzo di interfacce per creare oggetti , ma non impedisce loro di essere utilizzati per creare variabili .
Considera cosa sta effettivamente accadendo in questo codice:
Map<String, String> hashMap = new HashMap<>();
-
Una variabile di riferimento è dichiarata sullo stack con un nome "hashMap" e digita Map<String, String>
.
-
A new
istanza di tipo HashMap<>
viene creata su heap
-
Alla variabile 'hashMap' è assegnato un handle di riferimento (ovvero un valore dell'indirizzo di memoria) relativo all'istanza appena creata.
Nota:
- una variabile è un'area di memoria denominata , nello stack.
- un oggetto è una istanza di una classe , nell'heap.
- una variabile di riferimento è una variabile per un handle di riferimento .
- un handle di riferimento è un numero che rappresenta la posizione di memoria di un oggetto sull'heap.
Questo è importante perché ci sono due "cose" che vengono create in memoria, una variabile di riferimento e un oggetto. Una variabile di riferimento è più di un semplice nome per un oggetto; infatti una variabile di riferimento può mantenere un handle su qualsiasi oggetto, a condizione che il tipo di oggetto sia compatibile con il tipo della variabile.
Ad esempio, tutte le classi in Java sono in definitiva derivate da Object
, quindi una variabile il cui tipo è Object
può fare riferimento a qualsiasi istanza di qualsiasi classe.
Tuttavia, una variabile di tipo Map<String, String>
può solo fare riferimento a un'istanza di una classe che implementa l'interfaccia Map<String, String>
.
In definitiva, non c'è alcun problema con la creazione di una variabile da un'interfaccia, poiché le variabili di riferimento non supportano alcun comportamento in sé (tranne che per la garbage collection). Una variabile di riferimento è un modo per un programma di tenere traccia degli oggetti allocati nell'heap e il tipo di una variabile determina le operazioni che il programma può eseguire su un oggetto di riferimento.