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:
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ù… 🙂