salve a tutti, avrei bisogno di capire una cosa riguardo a questo frammento di codice, premetto che ho appena iniziato a studiare java, quindi perdonatemi se la domanda risulta banle!!!

codice:
public class Auto {

public static void main (String[] argv){

Veicolo v = new Veicolo();     //Veicolo = superclasse
Macchina fiat = v;                //Macchina = classe derivata di Veicolo  
fiat.muovi(120);

}//fine metodo main
}//fine class Auto
Avrei bisogno di sapere una cosa...
il codice sopra l'ho preso da un esercizio di un libro...
cosa vuol dire la dichiarazione Macchina fiat = v; ???
cioè ... io creo un'istanza della superclasse Veicolo di tipo Macchina???
e a cosa servirebbe???
scrivendo Macchina fiat = new Macchina(); non sarebbe la stessa cosa visto che la sottoclasse Macchina ha ereditato tutto dalla superclasse???quale sarebbe la differenza??

un'altra domanda... queste due istruzioni sono uguali?

Macchina fiat = v;
Macchina fiat = new Veicolo;

per favore, aiutatemi a sciogliere questi tremendi dubbi, cercato dappertutto, ma non riesco a capire il concetto...

grazie in anticipo per le risposte