Super()

di il
5 risposte

Super()

Buongiorno ,

Sto leggendo il tutorial che include Super() di Oracle : https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
Se super() viene omesso all'interno del costruttore della sottoClasse , il compilatore automaticamente lo aggiunge senza argomenti.

In netBeans mi da errore se viene omesso. Forse una configurazione dell'IDE ?
Un'altra cosa che non capisco è dato questo costruttore della superClasse:

 public Game(int pWidth, int pHeight, int tileWidth, int tileHeight){
            PANEL_WIDTH   = pWidth; 
            PANEL_HEIGHT  = pHeight;
            TILE_WIDTH    = tileWidth;
            TILE_HEIGHT   = tileHeight;
    }


Nel costruttore della sottoClasse scrivo :

public Player(int posX, int posY, int wWidth, int wHeight) {
	
           super(posX,posY,wWidth,wHeight);
                
            
	}
In teoria uso Super anche per accedere al costruttore , dove dice:
What You Can Do in a Subclass
...
- You can write a subclass constructor that invokes the constructor of the superclass, either implicitly or by using the keyword super.
Ora gli argomenti all'interno di Super posX e posY non appartengono alla superClasse. Perchè devo includerli ?
Grazie
Ciao

5 Risposte

  • Re: Super()

    Cyrano ha scritto:


    Se super() viene omesso all'interno del costruttore della sottoClasse , il compilatore automaticamente lo aggiunge senza argomenti.
    La PRIMA istruzione di un costruttore DEVE essere una invocazione super() o this() (con o senza argomenti, a seconda). Se il programmatore non scrive nulla di questo, il compilatore mette in automatico un super(); SENZA argomenti.

    Cyrano ha scritto:


    In netBeans mi da errore se viene omesso. Forse una configurazione dell'IDE ?
    Se c'è un super() SENZA argomenti (esplicito o implicito che sia), allora la super-classe DEVE avere un costruttore senza argomenti. Se non ce l'ha ... allora è ovviamente un errore.

    Cyrano ha scritto:


    Ora gli argomenti all'interno di Super posX e posY non appartengono alla superClasse. Perchè devo includerli ?
    Il costruttore Player ha quei 4 parametri. E tu semplicemente stai passando i loro valori come ARGOMENTI nella chiamata al super-costruttore. Tutto qui.
    La super-classe ha un costruttore che riceve 4 int e tu stai passando 4 int. Tutto qui. Poi se siano quelli giusti e nell'ordine giusto ... questo NON lo sa. Lo devi "sapere" tu.
  • Re: Super()

    AndBin ha scritto:


    La super-classe ha un costruttore che riceve 4 int e tu stai passando 4 int. Tutto qui. Poi se siano quelli giusti e nell'ordine giusto ... questo NON lo sa. Lo devi "sapere" tu.
    All'inizio faccio così. pWidth e pHeight rappresentano il size del JPanel che passo come informazione.
    esempio:
    
    Game game  = new Game (pWidth,pHeight,32,32);
    Player player = new Player(0,600,pWidth,pHeight);  //posX = 0 ; posY = 600;
    
    Ora mi accorgo che c'e qualcosa che non quadra ( mio errore) perchè vedo delle informazioni ridondanti (pWidth e pHeight).
    Prima erono due classi non "legate".

    AndBin ha scritto:


    La super-classe ha un costruttore che riceve 4 int e tu stai passando 4 int
    Ora ho corretto così:
    
    public Player(int posX, int posY) {
              super(posX,posY);
     }     
    
    e quindi così:
    
    Game game  = new Game (pWidth,pHeight,32,32);
    Player player = new Player(0,600);  //posX = 0 ; posY = 600;
    
    Ma nel costruttore della sottoClasse Player , mi da errore
    Io vorrei ereditare pWidth e pHeight nella sottoClasse Player. Entrambi i field hanno modifier protected
  • Re: Super()

    Cyrano ha scritto:


    Ora mi accorgo che c'e qualcosa che non quadra ( mio errore) perchè vedo delle informazioni ridondanti (pWidth e pHeight).
    Ma non è qualcosa di "sbagliato" ... stai semplicemente passando delle medesime informazioni a più oggetti. Di per sé non c'è nulla di palesemente errato in questo. Poi, ovviamente, io non ho visione completa di quanto stai facendo, quindi bisognerebbe vedere bene se davvero si può fare diversamente e come.

    Cyrano ha scritto:


    Prima erono due classi non "legate".
    E perché adesso lo sono? Player estende Game ... quind un Player è-un Game, ha senso secondo te?

    Cyrano ha scritto:


    Io vorrei ereditare pWidth e pHeight nella sottoClasse Player. Entrambi i field hanno modifier protected
    E allora sì, li erediti MA qui stai costruendo un oggetto, gli devi passare qualcosa! Non è questione di "ereditare" (un campo o metodo).
  • Re: Super()

    Ho diviso Player da Game perchè in effetti non c'entra nulla.Ora il problema si è eliminato da solo.
    Quello che non riuscivo a capire è perchè sono obbligato a passare gli argomenti al super-costruttore.
    Probabilmente se l'eredità avesse avuto un senso fin da subito ,non me lo sarei chiesto
    Grazie
  • Re: Super()

    Cyrano ha scritto:


    Quello che non riuscivo a capire è perchè sono obbligato a passare gli argomenti al super-costruttore.
    La fase di costruzione deve sempre arrivare fino a java.lang.Object. In sostanza, un costruttore è sempre obbligato ad invocare un costruttore nella super-classe, a meno che faccia un chiamata this() nel qual caso chiama un costruttore della stessa classe. Ma ad un certo punto ci deve essere un costruttore che fa un super(). E così via fino a java.lang.Object.

    E se la super-classe ha N costruttori, la sotto-classe ha la scelta di quale invocare. Chiaramente tra quelli "accessibili" (un costruttore può essere private).
Devi accedere o registrarti per scrivere nel forum
5 risposte