Ciao a tutti,

in questi giorni mi trovo ad affrontare dei problemi dovuti al binding dinamico di Java.

Dato il codice che riporto sotto dovrei riuscire a capire cosa il programma stamperebbe nel caso in cui eseguissi nel main le istruzioni che riporto sotto il codice. Le soluzioni sarebbero:

Point1D.distance
1.0
Point2D.distance
1.4142135623730951
Point1D.distance
0.0
Point2D.distance

Exception in thread "main" java.lang.ClassCastException: Point1D cannot be cast to Point2D
Se poi l’esecuzione proseguisse:
Point1D.distance
1.0
Point2D.distance
1.4142135623730951


Potreste spiegarmi per bene i passaggi di cosa fa il compilatore a run-time e in particolare perché viene generata quell'eccezione alla quarta stampa e non all'ultima?

Grazie mille.

codice:

public abstract class Point {                                                 
 
 public abstract double distance (Point p);

}

                    
public class Point1D extends Point {
  
private double c1;
 
 public Point1D (double c1) {
     this.c1 = c1;
  }

  public double getC1() {
     return c1;
  }

 public double distance (Point p) {
      return Math.abs(((Point1D) p).getC1()-c1);
  }}
                    

public class Point2D extends Point1D {
   private double c2;

  public Point2D (double c1, double c2) {
      super(c1);
    this.c2 = c2;
   }
 
public double getC2() {
      return c2;
}
                       
public double distance (Point p) {
      return Math.sqrt(Math.pow(((Point2D) p).getC1()-this.getC1(), 2) +
     Math.pow(((Point2D) p).getC2()-this.getC2(), 2));
    }
    
public double distance (Point2D p) {
      return Math.sqrt(Math.pow(p.getC1()-this.getC1(), 2) +        
                 Math.pow(p.getC2()-this.getC2(), 2));                     
}}
 
codice:
Point p1 = new Point1D(0.0);
Point p2 = new Point1D(1.0);
Point p3 = new Point2D(0.0, 1.0);
Point p4 = new Point2D(1.0, 0.0);
double x;
x = p1.distance(p2);
System.out.println(x);
x = p3.distance(p4);
System.out.println(x);
x = p1.distance(p3);
System.out.println(x);
x = p3.distance(p1);
System.out.println(x);
p1=p3;
x = p2.distance(p1);
System.out.println(x);
x = p4.distance(p1);
System.out.println(x);