Le parole chiavi super e this.


Java Sun

Earthweb
(ex Gamelan)

Jars

Java Boutique

JavaWorld

PIP






  JSem: 3.2

   Super:

 Abbiamo già incontrato la parola chiave super che permette di riferirsi alla superclasse. (Quando si dice la superclasse si intende la classe che la nostra classe estende, cioè la classe immediatamente precedente.)
 La parola chiave super ha due utilizzi:

  • 1) chiamare un costruttore della superclasse
  • 2) permettere di accedere a membri della superclasse "nascosti" da membri della sottoclasse.



  • 1) Una sottoclasse può chiamare un costruttore della superclasse usando:
    	super(elenco parametri);

    super() deve essere la prima istruzione all'interno del costruttore di una sottoclasse.

    2) Se una classe contiene una variabile di istanza con lo stesso nome di una variabile di istanza della sua superclasse, la variabile della sottoclasse nasconde la variabile della superclasse; per accedere alla variabile della superclasse bisogna usare super; stesso discorso per i metodi.

    Esempio di utilizzo di super:

    class Num{
    private int x;
    //costruttore
    Num(int a){
    	x = a;
    	}
    //metodo
    	int Somma(){
    	return x;
    	}
    }
    
    class NumB extends Num{
    int y;
    //costruttore
    	NumB(int x, int b){
    	super(x);//osservare che x è private in Num
    	y = b;
    	}
    //metodo Somma in NumB
    	int Somma(){
    	return super.Somma()+y ;
    }
    //il vecchio metodo Somma in Num
    	int VSomma(){
    	return super.Somma();
    	}
    }
    
    

    Possiamo testare queste classi con la seguente applet:

    import java.applet.*;
    import java.awt.*;
    
    public class EsSuper extends Applet{
    
    NumB N = new NumB(3,4);
    
    public void paint(Graphics g){
    
    	g.drawString("Somma in NumB: " + N.Somma(),5,25);
    	g.drawString("Somma in Num: " + N.VSomma(),5,50);
    	}
    }
    
    

    L'outpout è:
    Somma in NumB: 7
    Somma in Num: 3

    Come osservato nel codice, super() permette, nei costruttori, di accedere alle variabili private della superclasse.
    Per sovrascrivere il metodo Somma() nella classe NumB, abbiamo richiamato con super il metodo della superclasse e l'abbiamo ampliato (con +y); questo in generale è l'utilizzo maggiore di super.
    super si riferisce sempre alla superclasse della classe corrente, non era quindi possibile invocare super.Somma() nell'applet (la superclasse dell'applet è Applet); per questo motivo abbiamo definito un metodo VSomma() della classe NumB.

    Un altro esempio per concludere:

    class Nume{
    int a;
    }
    
    
    class NumeB extends Nume{
    
    int a; //nasconde a in Nume
    
    //costruttore
    
    NumeB(int x, int y){
    
    super.a = x; //a in Nume
    a = y; //a in NumeB
    	}
    //metodo
    void mostra(){
    System.out.println("a nella superclasse: " + super.a);
    System.out.println("a nella sottoclasse: " + a);
    	}
    }
    

    possiamo vedere queste classi all'opera:

    class EsSuper2{
    
    public static void main(String[] args){
    
    NumeB N = new NumeB(3,4);
    N.mostra();
    	}
    }
    

    L'outpout è:
    a nella superclasse: 3
    a nella sottoclasse: 4



     next		content		previous