Data.java
Created with JBuilder
class Data {
  // Attributo costante: giorni in ogni mese
  private static final int[]
      GIORNI_IN_MESE = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 31, 30, 31};

  // Attributi variabili
  private int giorno;
  private int mese;
  private int anno;

  // Costruttore
  public Data( int gg, int mm, int aa ) {
    giorno = gg;
    mese = mm;
    anno = aa;
  }

  // Metodi di restituzione
  public int giorno() {
    return giorno;
  }
  public int mese() {
    return mese;
  }
  public int anno() {
    return anno;
  }

  // Metodo per calcolare la differenza tra due date (in giorni)
  public int sottrai( Data d ) {
    if (maggioreDi(d)) {
      if (anno > d.anno()) {
        // Calcola i giorni da d alla fine dell'anno di d
        int t = sottraiStessoAnno(31, 12, d.giorno, d.mese);
        // Calcola i giorni nella differenza tra gli anni - 1
        t += (anno - d.anno - 1) * 365;
        // Calcola i giorni dall'inizio dell'anno di this a this
        t += sottraiStessoAnno(giorno, mese, 1, 1);
        return t;
      } else {
        return sottraiStessoAnno(giorno, mese, d.giorno, d.mese);
      }
    } else {
      return 0;
    }
  }

  // Metodo per confrontare due date
  public boolean maggioreDi( Data d ) {
    if (anno > d.anno()) {
      return true;
    } else if ((anno == d.anno) &&
               (mese > d.mese)) {
      return true;
    } else if ((anno == d.anno) &&
               (mese == d.mese) &&
               (giorno > d.giorno)) {
      return true;
    }
    return false;
  }

  // Metodo per sottrarre giorni e mesi all'interno dello stesso anno
  private int sottraiStessoAnno(int g1, int m1, int g2, int m2) {
    // Trasforma le due date in mesi dall'inizio dell'anno e le sottrae
    int d1 = g1;
    for (int m = 1; m < m1; ++m) {
      d1 += GIORNI_IN_MESE[m];
    }
    int d2 = g2;
    for (int m = 1; m < m2; ++m) {
      d2 += GIORNI_IN_MESE[m];
    }
    return (d1 - d2);
  }

}

Data.java
Created with JBuilder