Ciao a tutti, ho creato una classe Punto
public class Punto {
private double x;
private double y;
public Punto() { // costruttore di default
x=0;
y=0;
}
public Punto(double x,double y) {
this.x=x;
this.y=y;
}
public Punto(Punto p) {
this.x=p.x;
this.y=p.y;
}
public void sposta(x,y) {
this.x=x;
this.y=y;
}
}
l'oggetto è mutabile in quanto il metodo sposta non crea un nuovo oggetto Punto ma modifica l'oggetto chiamante.
se nel main scrivo:
final Punto p=new Punto(3,3);
come mai se scrivo
p.sposta(0,0);
l'oggetto viene modificato pur essendo final?
poi ho scritto anche questa classe Triangolo:
public class Triangolo {
// per costruire un triangolo abbiamo bisogno di 3 punti non allineati
private Punto p1,p2,p3; // vertici
private double a,b,c; // lati
public Triangolo(Punto p1, Punto p2, Punto p3) {
a=p1.distanza(p2);
b=p2.distanza(p3);
c=p3.distanza(p1);
if(( a>=b+c ) || ( b>=a+c ) || ( c>=a+b )) {
System.out.println("Il Triangolo non esiste");
System.exit(-1);
}
this.p1=new Punto(p1);
this.p2=new Punto(p2);
this.p3=new Punto(p3);
}
public Triangolo(Triangolo t) {
this.p1=t.p1; this.a=t.a;
this.p2=t.p2; this.a=t.b;
this.p3=t.p3; this.c=t.c;
}
quello che mi domando adesso è per pura curiosità:
nel costruttore di copia public Triangolo(Triangolo t)
cosa cambia se scrivo:
this.p1=t.p1;
oppure
this.p1=new Punto(t.p1);
cioè anche se i punti sono in aliasing i triangoli non lo sono e inoltre non c'è modo di modificare i triangoli perchè non si possono modificare i punti