Originariamente inviato da bircastri
ti rispondo alla seconda domanda si
In generale NO e ti spiego il motivo:

se tu hai un veicolo v inizializzato in un momento t, se dopo 10 istruzioni fai

codice:
Macchina fiat = v;
assegni a fiat il riferimento di v. Significa che adesso hai 2 contenitori (variabili) che puntano (passami il termine) allo stesso oggetto.

ma se tu fai
codice:
Veicolo v = new Veicolo(); 
//dopo un po'
Macchina fiat = new Veicolo();
a fiat assegni un riferimento ad un oggetto di tipo veicolo, che non è lo stesso di v!!Adesso in memoria hai 2 oggetti di tipo veicolo referenziati da 2 variabili.

Anche quando fai

codice:
Veicolo v = new Veicolo(); 
Macchina fiat = v;
qui hai in fiat un riferimento ad un'istanza pulita (appena nata) di veicolo, in memoria hai un solo oggetto, ma 2 riferimenti vi puntano.

Riepilogando: l'assegnamento (fiat = v)comporta 2 riferimenti che puntano allo stesso oggetto, il new comporta avere 2 riferimenti che puntano ad oggetti differenti.

Riguardo la prima domanda, l'esercizio vuole farti degli esempi su ereditarietà e polimorfismo