Cos'è dinamico in Java?
"Dinamico" significa semplicemente cambiare, che generalmente (nei linguaggi di programmazione) significa cambiare qualcosa a tempo di esecuzione che non è esplicitamente codificato nel codice sorgente. Quindi una dichiarazione "if" sarebbe un tipo molto minore di dinamica. Generare codice a runtime che non c'era al momento della compilazione sarebbe molto dinamico: LISP e Tcl e Forth sono tutti linguaggi dove questo è il modo normale di programmare. Se il vostro linguaggio di programmazione può essere pensato come "continuare ad estendere ciò che il compilatore può fare fino a quando il problema che volete risolvere è risolto da un'operazione integrata", allora avete un linguaggio molto dinamico.
Anche molti linguaggi interpretati, come Python e Ruby, sono dinamici. Si possono caricare nuovi file sorgente durante l'esecuzione, si possono applicare patch al codice che è già stato compilato, ecc.
I linguaggi compilati tendono ad essere (ovviamente) abbastanza non dinamici. In Java, c'è il "dispatch dinamico", alias "late binding", alias "method overrides". Quando si ha una superclasse con diverse sottoclassi, non si può dire guardando il codice sorgente quale codice eseguibile sarà invocato da una chiamata alla superclasse. (Ad esempio, se Manager e Peon sono entrambe sottoclassi di Employee, allora non potete dire quale codice viene invocato da Employee.grantRaise() guardando il codice sorgente in fase di compilazione. Potete caricare nuove classi già compilate a runtime, in un modo standard e supportato dal linguaggio. (Lo si può fare in C, ma lo standard C non lo supporta; bisogna passare attraverso il sistema operativo ed è diverso per ogni sistema e compilatore e così via)
L'ultimo modo in cui Java è dinamico è la riflessione. Potete usare i metodi di riflessione per operare su classi e istanze specificate da stringhe. In altre parole, anche senza caricare nuovo codice, potete decidere quale classe già caricata potete usare Class.forName() per ottenere la classe e istanziarne un'istanza. Se la stringa che contiene il nome viene letta a runtime, non c'è modo di sapere quale classe verrebbe istanziata a tempo di compilazione.