Ereditarietà

di il
2 risposte

Ereditarietà

Ragazzi ho questo codice:
class Base {
   public void test() {
      System.out.println("Base");
   }
}

//DerivedA.java :

class DerivedA extends Base {
   public void test () {
      System.out.println("DerivedA ");
   }
}

//DerivedB.java :

class DerivedB extends DerivedA {
   public void test() {
      System.out.println("DerivedB ");
   }
   public static void main(String [] args) {
      Base b1 = new DerivedB ();
      Base b2 = new DerivedA ();
      Base b3 = new DerivedB ();
      b1 = (Base) b3;
      Base b4 = (DerivedA) b3;
      b1.test ();
      b4.test ();
   }
}
compilandolo esce "DerivedB DerivedB ", io avevo pensato che b1 diventasse un oggetto di tipo Base e quindi stampasse "Base" e b4 "DerivedA" dato che gli viene passato un'oggetto di tipo DerivedB castato in DerivedA

2 Risposte

  • Re: Ereditarietà

    maracaibo25 ha scritto:


    compilandolo esce "DerivedB DerivedB ", io avevo pensato che b1 diventasse un oggetto di tipo Base e quindi stampasse "Base" e b4 "DerivedA" dato che gli viene passato un'oggetto di tipo DerivedB castato in DerivedA
    Il ragionamento da fare è questo:

    b1.test ();

    b1 è una variabile di tipo Base e gli viene assegnato il valore di b3. Nota che il cast (Base) NON cambia nulla (ed è di fatto inutile). L'oggetto realmente assegnato a b3 e quindi b1 è un DerivedB. Quindi siccome DerivedB ridefinisce il test() è questo di DerivedB quello che viene realmente eseguito.

    b4.test ();

    b4 è una variabile di tipo Base e gli viene assegnato il valore di b3. Nota che il cast (DerivedA) è un narrowing ("down" cast) perché b3 è di tipo Base e la JVM deve verificare a runtime se l'oggetto realmente assegnato è-un DerivedA. Siccome l'oggetto assegnato a b3 è un DerivedB che estende DerivedA, il cast a runtime ha successo. Ma NON cambia nulla nell'oggetto! L'oggetto è comunque realmente un DerivedB. Quindi anche qui il test() eseguito è quello di DerivedB.
  • Re: Ereditarietà

    andbin ha scritto:



    Il ragionamento da fare è questo:

    b1.test ();

    b1 è una variabile di tipo Base e gli viene assegnato il valore di b3. Nota che il cast (Base) NON cambia nulla (ed è di fatto inutile). L'oggetto realmente assegnato a b3 e quindi b1 è un DerivedB. Quindi siccome DerivedB ridefinisce il test() è questo di DerivedB quello che viene realmente eseguito.

    b4.test ();

    b4 è una variabile di tipo Base e gli viene assegnato il valore di b3. Nota che il cast (DerivedA) è un narrowing ("down" cast) perché b3 è di tipo Base e la JVM deve verificare a runtime se l'oggetto realmente assegnato è-un DerivedA. Siccome l'oggetto assegnato a b3 è un DerivedB che estende DerivedA, il cast a runtime ha successo. Ma NON cambia nulla nell'oggetto! L'oggetto è comunque realmente un DerivedB. Quindi anche qui il test() eseguito è quello di DerivedB.
    ok grazie andbin
Devi accedere o registrarti per scrivere nel forum
2 risposte