Java, l’ereditarietà e i reference

Java, l’ereditarietà e i reference

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”.
ClassB extends ClassA
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ù… 🙂