Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    55

    [JAVA] classe che estende altra classe

    Ciao a tutti, qualcuno pu� risolvere questo mio dubbio?
    Ho questo algoritmo:
    codice:
    class A {
              A() {
                System.out.println(0);
              }
              A( int i ) {
                System.out.println(i);
              }
    }
    
    public class B extends A {
       public static void main( String [] a) {
              new B();
       }
    }
    come mai quando si crea un nuovo oggetto B viene automaticamente chiamato il costruttore di A?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Lodin Visualizza il messaggio
    come mai quando si crea un nuovo oggetto B viene automaticamente chiamato il costruttore di A?
    Premessa: una classe ha SEMPRE almeno 1 costruttore. Se il programmatore non ne definisce almeno uno esplicitamente, il compilatore ne inserisce uno implicito, di "default" che ha principalmente 2 caratteristiche: a) non ha argomenti e b) fa una chiamata super(); senza (ovviamente) argomenti per invocare il costruttore della super-classe. (nota: esiste una terza caratteristica ma ora non è importante)

    Siccome B estende A, sono in relazione. E siccome in B NON c'è un costruttore esplicito, il compilatore inserisce quello di default, che appunto fa la chiamata super(). Che in questo caso non dà problemi perché in A esiste un costruttore senza argomenti.

    Nota: se in A togliessi il primo costruttore, quello senza argomenti, la classe A compila ma la classe B così come è NON compilerebbe.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    55
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Premessa: una classe ha SEMPRE almeno 1 costruttore. Se il programmatore non ne definisce almeno uno esplicitamente, il compilatore ne inserisce uno implicito, di "default" che ha principalmente 2 caratteristiche: a) non ha argomenti e b) fa una chiamata super(); senza (ovviamente) argomenti per invocare il costruttore della super-classe. (nota: esiste una terza caratteristica ma ora non è importante)

    Siccome B estende A, sono in relazione. E siccome in B NON c'è un costruttore esplicito, il compilatore inserisce quello di default, che appunto fa la chiamata super(). Che in questo caso non dà problemi perché in A esiste un costruttore senza argomenti.

    Nota: se in A togliessi il primo costruttore, quello senza argomenti, la classe A compila ma la classe B così come è NON compilerebbe.
    grazie in anticipo per la risposta veloce!
    Ho provato ad inserire un costruttore senza parametri in B che mi stampa la scritta "niente". Il risultato è che il programma stampa:
    0
    niente
    esattamente in quest'ordine. La cosa è strana perchè essendoci il costruttore di B, non dovrebbe essere richiamato quello di A, sbaglio?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Lodin Visualizza il messaggio
    grazie in anticipo per la risposta veloce!
    Ho provato ad inserire un costruttore senza parametri in B che mi stampa la scritta "niente". Il risultato è che il programma stampa:

    esattamente in quest'ordine. La cosa è strana perchè essendoci il costruttore di B, non dovrebbe essere richiamato quello di A, sbaglio?
    La PRIMA istruzione di un costruttore è SEMPRE o una invocazione super() (esplicita o implicita) oppure una invocazione esplicita this() (se il programmatore desidera sfruttare e invocare un altro costruttore della stessa classe).

    Ma in ogni caso il super-costruttore viene sempre prima.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    55
    Quote Originariamente inviata da andbin Visualizza il messaggio
    La PRIMA istruzione di un costruttore è SEMPRE o una invocazione super() (esplicita o implicita) oppure una invocazione esplicita this() (se il programmatore desidera sfruttare e invocare un altro costruttore della stessa classe).

    Ma in ogni caso il super-costruttore viene sempre prima.
    ah ho capito. Quindi ipotizzando l'assenza della classe B, il costruttore di A (implicito o esplicito che sia) avrebbe comunque fatto una chiamata a super() richiamando quale classe? Object?

    Grazie mille!

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Lodin Visualizza il messaggio
    il costruttore di A (implicito o esplicito che sia) avrebbe comunque fatto una chiamata a super() richiamando quale classe? Object?
    In A hai messo due costruttori espliciti (quindi quello implicito NON c'è). Ma in questi la prima istruzione NON è il tuo println ... è la chiamata super() che il compilatore inserisce in automatico se non sei tu che metti un super() o this() esplicito con/senza argomenti.

    E la super-classe di A è (implicitamente) ... Object! In sostanza la catena di invocazione dei costruttori DEVE sempre arrivare fino a Object. In un modo o nell'altro (altrimenti una tua classe non compilerebbe).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    55
    Quote Originariamente inviata da andbin Visualizza il messaggio
    In A hai messo due costruttori espliciti (quindi quello implicito NON c'è). Ma in questi la prima istruzione NON è il tuo println ... è la chiamata super() che il compilatore inserisce in automatico se non sei tu che metti un super() o this() esplicito con/senza argomenti.

    E la super-classe di A è (implicitamente) ... Object! In sostanza la catena di invocazione dei costruttori DEVE sempre arrivare fino a Object. In un modo o nell'altro (altrimenti una tua classe non compilerebbe).
    Ho capito, sei stato chiarissimo! grazie mille

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.