Costruttori ed ereditarietà

di il
11 risposte

Costruttori ed ereditarietà

Ciao a tutti io ho queste due classi:
public class A {
     public A() {
         m();
     }

     public void m() {
         System.out.println("metodo della classe padre");
     }
}

public class B extends A {
    public B() {}
    
    public void m() {
        System.out.println("metodo della classe figlio");
    }
}
se in un main scrivo:
B b=new B();
viene stampato "metodo della classe figlio" per dynamic binding

come mai accade questo? come fa a chiamare il metodo di B se ancora b non è stata istanziata?
Non dovrebbe essere sollevata una eccezione?

11 Risposte

  • Re: Costruttori ed ereditarietà

    La risposta la puoi trovare qua, in particolare queste righe:
    Note: If a constructor does not explicitly invoke a superclass constructor, the Java compiler automatically inserts a call to the no-argument constructor of the superclass.
    Questo implica che la tua classe B, di fatto è la seguente:
    
    public class B extends A {
        public B() {
            super();
        }
        
        public void m() {
            System.out.println("metodo della classe figlio");
        }
    }
    
    Questo spiega perché viene chiamato il metodo m(). Poi a causa del dynamic binding viene richiamato il metodo appartenente alla classe B, e non ad A.
  • Re: Costruttori ed ereditarietà

    Si lo so che in b viene chiamato implicitamente super() e quindi il costruttore della super classe.
    appunto per questo quando sono nel costruttore della superclasse come fa ad essere chiamato il metodo di B se in quel dato istante b non è ancora istanziato?
  • Re: Costruttori ed ereditarietà

    Beh di fatto è quello che succede anche con la classe A! Anche in quel caso, infatti, richiami un metodo all'interno del costruttore. Su dice che il corpo del costruttore è l'ultima cosa ad essere eseguita al momento della creazione di un oggetto, e ciò ha senso. Se, infatti, l'oggetto non fosse completamente costruito allora potrebbero verificarsi dei problemi anche in questo caso (la variabile var non esisterebbe)
    
    public class Foo {
       private int var;
       public Foo(){
          var = 1;
       }
    }
    
  • Re: Costruttori ed ereditarietà

    Ok,puoi farmi un esempio in cui tramite il costruttore della super classe (invocato implicitamente dal costruttore della sotto classe) comincio a eseguire qualche operazione che preveda che già la sotto classe sia istanziata?
    cioè mi piacerebbe capire cosa non si dovrebbe mai fare in un costruttore di una super classe o sotto classe
  • Re: Costruttori ed ereditarietà

    Questa pagina potrebbe chiarirti cosa può essere pericoloso in un costruttore a causa del dynamic binding!
  • Re: Costruttori ed ereditarietà

    Quindi nell'esempio che ho fatto io,le cose sarebbero potute andare male,giusto?
  • Re: Costruttori ed ereditarietà

    Beh dipende..se sei consapevole del fatto che il metodo "m" viene richiamato dal costruttore della superclasse, e quindi prima del costrutture della sottoclasse, allora non è detto che succedano danni. Di sicuro c'è il rischio di complicarsi la vita dovendo pensare a tutto ciò che può succedere
  • Re: Costruttori ed ereditarietà

    Ti ringrazio molto.
    un'ultima cosa:
    se io ho un metodo:
    void m() {
        System.out.println("metodo");// potrebbe fare qualsiasi cosa 
    }
    nel costruttore di una classe ad esempio ho necessità di fare un operazione che è scritta in m

    cosa è meglio fare:
    scrivere all'interno del costruttore il metodo?
    public Classe() {
        m();
    }
    oppure scrivere esplicitamente l'operazione?
    public Classe() {
        System.out.println("metodo");
    }
  • Re: Costruttori ed ereditarietà

    Per la politica del riuso probabilmente è meglio usare i metodi.
    Inoltre puoi evitare tutti i problemi visti finora (i quali possono esistere solamente in presenza di metodi overridable) rendendo questo metodo privato.
  • Re: Costruttori ed ereditarietà

    Infatti ci avevo pensato anch'io,grazie tante per il supporto
  • Re: Costruttori ed ereditarietà

    Di niente
Devi accedere o registrarti per scrivere nel forum
11 risposte