Se in una TuaClasse fai es. un:
AltraClasse ac = new AltraClasse();
all'interno del bytecode (il contenuto del .class) di TuaClasse c'è un riferimento "statico" ad AltraClasse. Se AltraClasse non è rintracciabile (non è "in classpath"), la tua applicazione non funzionerà e si schianterà con un NoClassDefFoundError nel momento in cui è necessario caricare la definizione di AltraClasse.
Il Class.forName invece è utile specialmente nei casi dove il nome della classe non è noto a priori (magari è ottenuto da file di configurazione, metadati, ecc...) e c'è di mezzo il polimorfismo nel senso che quella classe magari implementa una interface X (o super-classe, anche astratta) che TU conosci e di cui hai la definizione. Questo viene sfruttato ad esempio quando si cerca di realizzare un sistema basato su "plugin".