Andrea78 ha scritto:
La mia domanda è: perché con la configurazione in calce posso accedere al metodo statico della classe astratta attraverso
un oggetto ( w.write(); nella classe Programmer )?
Il fatto che la classe sia astratta, NON impedisce di invocare il metodo static. Un membro static è associato alla classe ... non ad una istanza (insomma, NON importa se Writer è istanziabile o no).
Inoltre per i metodi static non esiste il concetto di "override" (al massimo si parla di nascondere, "hiding"), quindi la versione davvero eseguita NON è quella dell'oggetto realmente istanziato ma quella scelta solo sulla base del tipo "statico" del reference. La variabile
w è di tipo Writer, quindi il metodo eseguito E' quello di questo tipo. Non conta che Writer ha sotto-classi in cui c'è un altro write.
Tra l'altro la invocazione funzionerebbe anche se facessi es.:
Writer w = null;
w.write();
Per poter invocare un metodo "statico", al compilatore NON importa il valore del reference (che sia null o non null) ma, ripeto, solo il tipo "statico" del reference che è dedotto Writer. Quindi: w.write() è uguale a fare Writer.write() anche se w fosse null.
P.S. tutto questo non c'entra direttamente con Java 8, vale per qualunque versione di Java.