Istanziare oggetto classe estesa

di il
4 risposte

Istanziare oggetto classe estesa

Salve, avendo un classe che estende un'altra tipo:
public class Prova{
 public String nome="Gino";
...
...
}

public class Prova2 extends Prova{
 public String cognome="Gini";
...
...
}
Qual'è il metodo corretto per istanziare l'oggetto che estende la superclasse?

public class Mainprova{
public static void main(String arr[]){

Prova Persona= new Prova2(); <------ Questa o quella sottostante ?

Prova2 Persona2= new Prova2(); 

}
}
Visto che ci siamo; la regola vale anche per le classi astratte?

Il dubbio sorge dai mille esempi trovati sul web in cui si fa riferimento alla superclasse nel momento della creazione dell'oggetto; ovviamente io ho provato entrambe le dichiarazioni e ambedue sembrano funzionare allo stesso modo.
Ringrazio in anticipo attendendo dei chiarimenti.

4 Risposte

  • Re: Istanziare oggetto classe estesa

    Pega ha scritto:


    Qual'è il metodo corretto per istanziare l'oggetto che estende la superclasse?
    Semplicemente conoscendo i costruttori che la sotto-classe mette a disposizione e che siano "accessibili".
    Non conta, ai fini della istanziazione, se/quale classe estende.

    Pega ha scritto:


    Visto che ci siamo; la regola vale anche per le classi astratte?
    Una classe "astratta" NON può essere istanziata. Il suo obiettivo è quello di essere estesa per fare qualcosa di più concreto (generalmente/tipicamente perché il concetto espresso dalla classe astratta è appunto troppo generico, astratto, come una classe es. Solido ).
    Ma dal punto di vista dei costruttori non c'è alcuna differenza con una classe "concreta" (non abstract). Una classe astratta può avere quanti/quali costruttori vuoi. Semplicemente non li puoi usare direttamente. Li può invocare solo una sotto-classe.
  • Re: Istanziare oggetto classe estesa

    andbin ha scritto:


    Pega ha scritto:


    Qual'è il metodo corretto per istanziare l'oggetto che estende la superclasse?
    Semplicemente conoscendo i costruttori che la sotto-classe mette a disposizione e che siano "accessibili".
    Non conta, ai fini della istanziazione, se/quale classe estende.

    Pega ha scritto:


    Visto che ci siamo; la regola vale anche per le classi astratte?
    Una classe "astratta" NON può essere istanziata. Il suo obiettivo è quello di essere estesa per fare qualcosa di più concreto (generalmente/tipicamente perché il concetto espresso dalla classe astratta è appunto troppo generico, astratto, come una classe es. Solido ).
    Ma dal punto di vista dei costruttori non c'è alcuna differenza con una classe "concreta" (non abstract). Una classe astratta può avere quanti/quali costruttori vuoi. Semplicemente non li puoi usare direttamente. Li può invocare solo una sotto-classe.
    Intanto ti ringrazio per la risposta!

    Si, so che non è possibile istanziare una classe astratta;
    Mi è capitato spesso di vedere scritto:
    Animale Furia = new Cavallo();
    Dove animale è appunto il nome della classe astratta, e mi chiedevo se fosse differente scriverlo come:
    Cavallo Furia = new Cavallo();
    Questo è il mio dubbio...
    Mi sembra di aver capito che non cambia nulla pero'.

    Grazie ancora!
  • Re: Istanziare oggetto classe estesa

    Pega ha scritto:


    Mi è capitato spesso di vedere scritto:
    Animale Furia = new Cavallo();
    Dove animale è appunto il nome della classe astratta, e mi chiedevo se fosse differente scriverlo come:
    Cavallo Furia = new Cavallo();
    Questo è il mio dubbio...
    Mi sembra di aver capito che non cambia nulla pero'.
    Dal punto della istanziazione no, non cambia nulla. Ma assegnare ad una variabile Cavallo invece che al supertipo Animale, ovviamente cambia ... cambia cioè il livello di "astrazione" che si vuole usare.
    Ma dipende poi da COSA devi fare poi su quel Furia. Se hai bisogno di usare metodi specifici di Cavallo (che non ci sono in Animale), ovviamente devi avere la variabile di tipo Cavallo. Altrimenti potresti stare un po' più sul generico assegnando ad un Animale.

    E' un po' la stessa cosa di quando si tiene una variabile di istanza come List<Qualcosa> invece che ArrayList<Qualcosa>. Perché? Perché generalmente è preferibile stare più sul generico, così può funzionare con implementazioni diverse di List.
    Generalmente se si riesce a generalizzare le cose, meglio è.

    Nel caso di una variabile locale come il tuo esempio, molto probabilmente potrebbe non fare granché differenza. La vera differenza è quando fai un metodo che ha come parametro Animale e non un tipo più specifico. Perché magari il metodo deve poter operare su "qualunque" animale in maniera generalizzata.
  • Re: Istanziare oggetto classe estesa

    andbin ha scritto:


    Pega ha scritto:


    Mi è capitato spesso di vedere scritto:
    Animale Furia = new Cavallo();
    Dove animale è appunto il nome della classe astratta, e mi chiedevo se fosse differente scriverlo come:
    Cavallo Furia = new Cavallo();
    Questo è il mio dubbio...
    Mi sembra di aver capito che non cambia nulla pero'.
    Dal punto della istanziazione no, non cambia nulla. Ma assegnare ad una variabile Cavallo invece che al supertipo Animale, ovviamente cambia ... cambia cioè il livello di "astrazione" che si vuole usare.
    Ma dipende poi da COSA devi fare poi su quel Furia. Se hai bisogno di usare metodi specifici di Cavallo (che non ci sono in Animale), ovviamente devi avere la variabile di tipo Cavallo. Altrimenti potresti stare un po' più sul generico assegnando ad un Animale.

    E' un po' la stessa cosa di quando si tiene una variabile di istanza come List<Qualcosa> invece che ArrayList<Qualcosa>. Perché? Perché generalmente è preferibile stare più sul generico, così può funzionare con implementazioni diverse di List.
    Generalmente se si riesce a generalizzare le cose, meglio è.

    Nel caso di una variabile locale come il tuo esempio, molto probabilmente potrebbe non fare granché differenza. La vera differenza è quando fai un metodo che ha come parametro Animale e non un tipo più specifico. Perché magari il metodo deve poter operare su "qualunque" animale in maniera generalizzata.
    Perfetto, grazie mille!
Devi accedere o registrarti per scrivere nel forum
4 risposte