Ma abbiamo davvero capito come vengono gestiti i reference in java?
Piccolo snippet per metterci alla prova.
Ammettiamo di avere 2 classi
- ClasseA
- ClasseB
e che ClasseB sia una sottoclasse di ClasseA ossia “ClasseB extends ClasseA”.

Ora, supponendo che le classi si trovino tutte nello stesso package, scriviamo questo codice nel nostro main method:
1 2 3 4 5 6 7 8 | ClasseA a; ClasseB b; a = new ClasseA(); b = new ClasseB(); a = b; //(1) b = a; //(2) |
Problemi?
Il codice scritto funziona? Anzi, compila?
La risposta è, ovviamente, no
e il problema è nell’ultima riga (2): b = a;
Perché?
Eppure sembra tutto ok!
In (1) abbiamo assegnato b ad a, quindi a = b. Come è mai possibile che scrivendo poi b = a la cosa non sia corretta?
La spiegazione è nel tipo di dichiarazione iniziale dei reference a e b.
ClasseA è una superclasse di ClasseB, quindi scrivere a = b è possibile per automatico widening (a è “più grande” di b). La cosa invece non è possibile in senso inverso perché b è “più piccolo” di a e non può quindi “contenerlo”.
L’osservazione più comune a questo punto è:
ma se in (1) abbiamo scritto a = b significa che a e b sono diventati uguali! Quindi come è mai possibile che b = a dia problemi? ![]()
Già, come è mai possibile?
Leggete il post su java i reference e la RAM e forse ne capirete di più…



