Quel codice che hai postato fa acqua da tutte le parti.
Punto 1. Se due oggetti sono in aliasing significa che sono uguali, quindi this==obj dovrebbe restituire true, altrimenti false. Con questa uguaglianza ti copri anche nel caso in cui obj sia null.
Punto 2. Cosa succede se l'Object che passi ad equals() non è un'oggetto
istanza di Auto??
Ti ritrovi una bella eccezione
ClassCastException
Punto 3. Per confrontare i double o li wrappi in oggetti Double oppure ti scrivi un metodino
sufficientementeProssimi(double a, double b, double eps)
che restituisce true se il valore assoluto di a-b sia minore di eps.
Cioè. se scrivo:
double a=5000.00005
double b=5000.00007
double eps=0.0001.
sufficientementeProssimi(a,b,eps)
//restituisce true
Per i double che devi confrontare ti basta che eps sia 0.01.
In questo modo confronti i double fino ai centesimi, e se dai millesimi in poi sono diversi non ti importa.
In definitiva equals diventa:
public boolean equals(Object obj) {
if(this==obj) return true;
if(!(obj istanceof Auto)) return false;
Auto a=(Auto)obj; //ora puoi fare il cast in modo sicuro.
//NB. a è sicuramente diversa da null ora.
//addesso si fanno i confronti
return marca.equals(a.marca) && modello.equals(a.modello) &&
colore.equals(a.colore) && sufficientementeProssimi(cilindrata, a.cilindrata, 0.01) &&
sufficientementeProssimi(prezzo, a.prezzo, 0.01);
}