ERRORE CODICE

di il
9 risposte

ERRORE CODICE

class Date {
String day;
String month;
public Date(String d, String m) {
day = d;
month = m;
print();
}
public void print(){
System.out.println(day +" "+month);
}
}
class Holiday extends Date {
String name;
public Holiday(String n) { // ---------------------- QUI
name = n;
print();
}
public Holiday(String d,String m,String n) {
super(d, m);
name = n;
print();
}
public void print(){
System.out.println(name);
}
public static void main(String[] args) {
Date x = new Holiday("5","April","Easter");
Holiday y = new Holiday("Easter");
}
}
Ciao ragazzi ho errore alla riga segnata (vedasi 'QUI'), mi da il seguente errore "constructor in class cannot be applied to given types"

9 Risposte

  • Re: ERRORE CODICE

    1) i metodi print dichiarali private
    2) dentro la classe Date ti manca il costruttore base public Date() {day = "";month = "";}
  • Re: ERRORE CODICE

    2) che collegamento c'è tra il costruttore di Date e Holiday? Il costruttore di Holiday non dovrebbe essere slegato da quello di Date?
  • Re: ERRORE CODICE

    giulio0 ha scritto:


    2) che collegamento c'è tra il costruttore di Date e Holiday? Il costruttore di Holiday non dovrebbe essere slegato da quello di Date?
    Il costruttore di Holiday deve richiamare un costruttore di Date perché "Holiday extends Date". Cosa richiami nel secondo caso? Il compilatore non sa più cosa fare perché l'unico costruttore di Date non è applicabile. Una possibile soluzione è appunto dichiarare un costruttore base di Date senza parametri.
  • Re: ERRORE CODICE

    Weierstrass ha scritto:


    giulio0 ha scritto:


    2) che collegamento c'è tra il costruttore di Date e Holiday? Il costruttore di Holiday non dovrebbe essere slegato da quello di Date?
    Il costruttore di Holiday deve richiamare un costruttore di Date perché "Holiday extends Date". Cosa richiami nel secondo caso? Il compilatore non sa più cosa fare perché l'unico costruttore di Date non è applicabile. Una possibile soluzione è appunto dichiarare un costruttore base di Date senza parametri.
    Il secondo costruttore di Holiday richiama il costruttore di Date nonostante i parametri siano diversi/di più/di meno?
  • Re: ERRORE CODICE

    giulio0 ha scritto:


    Weierstrass ha scritto:


    giulio0 ha scritto:


    2) che collegamento c'è tra il costruttore di Date e Holiday? Il costruttore di Holiday non dovrebbe essere slegato da quello di Date?
    Il costruttore di Holiday deve richiamare un costruttore di Date perché "Holiday extends Date". Cosa richiami nel secondo caso? Il compilatore non sa più cosa fare perché l'unico costruttore di Date non è applicabile. Una possibile soluzione è appunto dichiarare un costruttore base di Date senza parametri.
    Il secondo costruttore di Holiday richiama il costruttore di Date nonostante i parametri siano diversi/di più/di meno?
    E' obbligato a chiamarne uno. Tu come costruiresti una "casa con balcone" senza costuire una "casa"?
    Ci sono altre soluzioni rispetto a quella che ti ho detto, ovviamente
  • Re: ERRORE CODICE

    Va bene grazie
  • Re: ERRORE CODICE

    giulio0 ha scritto:


    2) che collegamento c'è tra il costruttore di Date e Holiday? Il costruttore di Holiday non dovrebbe essere slegato da quello di Date?
    Partiamo da una cosa: i costruttori, per definizione, non vengono mai "ereditati" dalle sotto-classi. Se una classe ha es. 3 costruttori, la sotto-classe NON ha "di serie" quei 3 costruttori con quelle stesse forme. Li devi scrivere esplicitamente, se vuoi.
    L'altro aspetto: la fase di costruzione/inizializzazione dell'oggetto deve sempre arrivare fino a Object, cioè un costruttore deve invocare un super-costruttore ecc.. fino ad invocare quello di Object (che non fa nulla di particolare).
    La prima istruzione di un costruttore DEVE essere una invocazione super( .... ) o this( .... ) con o senza argomenti, per invocare un altro costruttore. Se non metti una di queste due, il compilatore ci mette per default un super(); senza argomenti.

    Nel tuo caso Holiday avrebbe:
    public Holiday(String n) {
        super();   // <--- inserito dal compilatore
        name = n;
        // ...
    }
    Quindi si aspetterebbe di invocare un costruttore di Date che non ha parametri. Peccato che ... Date NON ha un costruttore senza parametri, perché ne hai inserito uno tu fatto come Date(String d, String m)
  • Re: ERRORE CODICE

    andbin ha scritto:


    giulio0 ha scritto:


    2) che collegamento c'è tra il costruttore di Date e Holiday? Il costruttore di Holiday non dovrebbe essere slegato da quello di Date?
    Partiamo da una cosa: i costruttori, per definizione, non vengono mai "ereditati" dalle sotto-classi. Se una classe ha es. 3 costruttori, la sotto-classe NON ha "di serie" quei 3 costruttori con quelle stesse forme. Li devi scrivere esplicitamente, se vuoi.
    L'altro aspetto: la fase di costruzione/inizializzazione dell'oggetto deve sempre arrivare fino a Object, cioè un costruttore deve invocare un super-costruttore ecc.. fino ad invocare quello di Object (che non fa nulla di particolare).
    La prima istruzione di un costruttore DEVE essere una invocazione super( .... ) o this( .... ) con o senza argomenti, per invocare un altro costruttore. Se non metti una di queste due, il compilatore ci mette per default un super(); senza argomenti.

    Nel tuo caso Holiday avrebbe:
    public Holiday(String n) {
        super();   // <--- inserito dal compilatore
        name = n;
        // ...
    }
    Quindi si aspetterebbe di invocare un costruttore di Date che non ha parametri. Peccato che ... Date NON ha un costruttore senza parametri, perché ne hai inserito uno tu fatto come Date(String d, String m)
    Tutta questa spiegazione sul costruttore vale anche per le interfacce e classi astratte? Nel senso se implemento ad una classe Aun'interfaccia od una classe astratta allora devo fare il costruttore alla classe A in caso queste avessero un costruttore e viceversa?
  • Re: ERRORE CODICE

    giulio0 ha scritto:


    Tutta questa spiegazione sul costruttore vale anche per le interfacce e classi astratte?
    Le interfacce sono qualcosa di puramente astratto (ignoriamo per un attimo le novità di Java 8+), NON hanno costruttori, NON le puoi istanziare.

    Una classe astratta può avere tutti i costruttori che vuoi, le regole sono le stesse per le classi "concrete" (non abstract). La principale caratteristica è che una classe astratta non è istanziabile. Il suo scopo principale è di essere estesa per fare qualcosa di reale.

    giulio0 ha scritto:


    Nel senso se implemento ad una classe Aun'interfaccia od una classe astratta allora devo fare il costruttore alla classe A in caso queste avessero un costruttore e viceversa?
    Scusa ma da questa frase-domanda non si capisce nulla ...
Devi accedere o registrarti per scrivere nel forum
9 risposte