This et super en java

Résolu/Fermé
swiso
Messages postés
58
Date d'inscription
samedi 13 avril 2013
Statut
Membre
Dernière intervention
4 juin 2014
- 14 avril 2013 à 22:47
swiso
Messages postés
58
Date d'inscription
samedi 13 avril 2013
Statut
Membre
Dernière intervention
4 juin 2014
- 15 avril 2013 à 22:46
En fait je suis en plein java, en ce moment !! et la notion de " super ", et l'opérateur " this" me semblent trop abstrait :// , voici un exemple que je suis entrain de traiter :


import java.awt.*;

public class AppliGridLayout extends Frame {

public AppliGridLayout(){

super("AppliGridLayout");

this.setLayout(new GridLayout(3,2));


for (int i = 1; i < 7; i++)
add(new Button(Integer.toString(i)));
this.pack();
this.show();
}

public static void main(String args[])
{
AppliGridLayout appli = new AppliGridLayout();
}
}


et merci d'avance =)

2 réponses

KX
Messages postés
16568
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
5 juillet 2022
2 968
15 avril 2013 à 06:18
Lorsque tu es dans ton main, tu peux faire :
appli.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

"appli" est une référence à un objet de ta classe "AppliGridLayout", et on utilise cette référence pour appeler la méthode setDefaultCloseOperation déclaré dans la classe JFrame et héritée par AppliGridLayout grâce à ton "extends JFrame"

Maintenant plaçons nous à l'intérieur de ta classe, tu ne peux pas utiliser "appli" comme référence de ton objet puisque celui n'est pas encore déclaré et qu'il correspond à un seul objet, pas à tous. C'est là qu'intervient "this" qui est une référence à l'objet courant.

Tu pourrais donc appeler la méthode setDefaultCloseOperation directement dans ta définition de classe AppliGridLayout grâce au mot clé this :
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Remarque : this est facultatif, par exemple tu ne l'as pas mis pour appeler la méthode "add(new Button(Integer.toString(i)));" mais implicitement c'est la référence à l'objet courant "this" qui a été utilisé.

Enfin, parlons un peu d'héritage, comme tu as défini une classe qui extends JFrame, tu peux utiliser, ajouter ou modifier des méthodes de JFrame.
Juste pour l'exemple, disons que nous voulons modifier la méthode setVisible pour lui faire un affichage dès qu'elle est affichée. Il faudrait faire comme ceci :

public void setVisible(boolean b)
{
    if (b)
        System.out.println("Affichage on");
    else
        System.out.println("Affichage off");
    
    super.setVisible(b);
}

Là j'ai utilisé le mot clé "super" pour utiliser la méthode setVisible de JFrame à l'intérieur de la déclaration de la méthode setVisible de AppliGridLayout.
Si j'avais utilisé this, cela aurait fait référence à la méthode setVisible de AppliGridLayout, la méthode aurait donc été récursive et il y aurait eu un problème, mais ici cela fera bien ce que l'on veut.

Je t'ai donc présenté l'utilité de ces deux mots-clés this et super, ce sont respectivement des références vers l'objet courant, et l'objet hérité.
Jusqu'à présent je ne les ai utilisé que pour manipuler des méthodes, mais ils permettent aussi de manipuler des attributs, tu as peut-être déjà fait ce genre de constructeur :

private int x;

public MaClasse(int x)
{
    this.x = x;
}

Ici, this permet d'indiquer que l'on utilise le "x" attribut de l'objet courant, parce que par défaut c'est le "x" paramètre du constructeur qui est utilisé.

Enfin, this et super permettent également d'appeler des constructeurs. C'est ce qui se passe dans ton code quand tu fais super("AppliGridLayout");
Utilisé en première ligne de ton constructeur, et sans spécifier de nom de méthode, super permet ici d'utiliser le constructeur de la classe JFrame, cela te permet d'initialiser ton objet "this" grâce au constructeur de "super".
Tu pourrais également utiliser "this" pour faire référence à un autre constructeur de la classe que tu définis, la syntaxe serait identique, exemple :

public MaClasse()
{
    this(0);
}

Ici j'ai repris le petit exemple de tout à l'heure, ce constructeur sans paramètre va se servir du constructeur public MaClasse(int x) en utilisant x=0, de même que tu utilisais title="AppliGridLayout" en faisant appel au constructeur JFrame(String title) dans ta ligne super("AppliGridLayout");

Voilà, tu sais tout sur this et super...
1
swiso
Messages postés
58
Date d'inscription
samedi 13 avril 2013
Statut
Membre
Dernière intervention
4 juin 2014

15 avril 2013 à 22:46
j'ai compris maintenant ! merci bcp ^__________^
0