in

Classes statiques et classes internes en Java

Classes statiques et classes internes en Java

Compilez les listes 5 et 6 comme suit :


javac *.java

Lorsque vous compilez une classe dont la méthode contient une classe locale, le compilateur crée un fichier de classe pour la classe locale dont le nom se compose du nom de la classe englobante, d'un signe dollar, d'un entier de base 1 et du nom de la classe locale. Dans ce cas, la compilation aboutit à EnclosingClass$1LClass.class et EnclosingClass.class.

Remarque sur le nom du fichier de classe local

Lors de la génération d'un nom pour le fichier de classe d'une classe locale, le compilateur ajoute un entier au nom généré. Cet entier est probablement généré pour distinguer le fichier de classe d'une classe locale du fichier de classe d'une classe membre non statique. Si deux classes locales ont le même nom, le compilateur incrémente l'entier pour éviter les conflits. Considérez l'exemple suivant :


public class EnclosingClass
{
    public void m1()
    {
       class LClass
       {
       }
    }

    public void m2()
    {
       class LClass
       {
       }
    }

    public void m3()
    {
       class LClass2
       {
       }
    }
}

EnclosingClass déclare trois méthodes d'instance qui déclarent chacune une classe locale. Les deux premières méthodes génèrent deux classes locales différentes portant le même nom. Le compilateur génère les fichiers de classe suivants :


EnclosingClass$1LClass.class
EnclosingClass$1LClass2.class
EnclosingClass$2LClass.class
EnclosingClass.class

Exécutez l’application comme suit :


java LCDemo

Vous devriez observer le résultat suivant :


5
15

Exemple : Utilisation de classes locales dans des expressions régulières

La bibliothèque de classes standard inclut des exemples d'utilisation de classes locales. Par exemple, Matcher classe, dans java.util.regexfournit un results() méthode qui renvoie un flux de résultats de correspondance. Cette méthode déclare une MatchResultIterator classe pour itérer sur ces résultats :


public Stream results()
{
   class MatchResultIterator implements Iterator
   {
      // members
   }
   return StreamSupport.
          stream(Spliterators.spliteratorUnknownSize(new MatchResultIterator(),
                                                     Spliterator.ORDERED |
                                                     Spliterator.NONNULL),
                 false);
}

Notez l'instanciation de MatchResultIterator() en suivant la déclaration de classe. Ne vous souciez pas des parties du code que vous ne comprenez pas ; pensez plutôt à l'utilité de pouvoir déclarer des classes dans les portées appropriées (comme un corps de méthode) pour mieux organiser votre code.

Classe interne de type 3 : classes anonymes

Les classes membres statiques, les classes membres non statiques et les classes locales ont des noms. En revanche, cours anonymes sont des classes imbriquées sans nom. Vous les introduisez dans le contexte d'expressions qui impliquent new opérateur et le nom d'une classe de base ou d'une interface implémentée par la classe anonyme :


// subclass the base class

abstract class Base
{
   // members
}

class A
{
   void m()
   {
      Base b = new Base()
               {
                 // members
               };
   }
}

// implement the interface

interface I
{
   // members
}

class B
{
   void m()
   {
      I i = new I()
            {
               // members
            };
   }
}

Le premier exemple montre une classe anonyme qui étend une classe de base. new Base() est suivi d'une paire de caractères entre accolades qui signifient la classe anonyme. Le deuxième exemple montre une classe anonyme implémentant une interface. Expression new I() est suivi d'une paire de caractères entre accolades qui signifient la classe anonyme.

A Lire aussi  Le déversement de Deepwater Horizon est 30% plus important que prévu: étude

Les classes anonymes sont utiles pour exprimer une fonctionnalité transmise à une méthode en tant qu'argument. Par exemple, considérons une méthode de tri d'un tableau d'entiers. Vous souhaitez trier le tableau par ordre croissant ou décroissant, en fonction des comparaisons entre les paires d'éléments du tableau. Vous pouvez dupliquer le code de tri, avec une version utilisant le moins que (<) pour une commande, et l'autre version utilisant le supérieur à (>) pour l'ordre inverse. Alternativement, comme indiqué ci-dessous, vous pouvez concevoir le code de tri pour invoquer une méthode de comparaison, puis passer un objet contenant cette méthode comme argument à la méthode de tri.

Liste 7. Utilisation d'une classe anonyme pour transmettre une fonctionnalité en tant qu'argument de méthode (Comparer.java)


public abstract class Comparer
{
   public abstract int compare(int x, int y);
}

Le compare() La méthode est invoquée avec deux éléments de tableau entier et renvoie l'une des trois valeurs : une valeur négative si x est inférieur à y0 si les deux valeurs sont identiques et une valeur positive si x est supérieur à y. La liste 8 présente une application dont sort() méthode invoque compare() pour effectuer les comparaisons.

A Lire aussi  le rétropédalage de Squeezie moqué, Booba clash le YouTubeur

Liste 8. Tri d'un tableau d'entiers avec l'algorithme de tri à bulles (ACDemo.java)


public class ACDemo
{
   public static void main(String() args)
   {
      int() a = { 10, 30, 5, 0, -2, 100, -9 };
      dump(a);
      sort(a, new Comparer()
                  {
                     public int compare(int x, int y)
                     {
                        return x - y;
                     }
                  });
      dump(a);
      int() b = { 10, 30, 5, 0, -2, 100, -9 };
      sort(b, new Comparer()
                  {
                     public int compare(int x, int y)
                     {
                        return y - x;
                     }
                  });
      dump(b);
   }

   static void dump(int() x)
   {
      for (int i = 0; i < x.length; i++)
         System.out.print(x(i) + " ");
      System.out.println();
   }

   static void sort(int() x, Comparer c)
   {
      for (int pass = 0; pass < x.length - 1; pass++)
         for (int i = x.length - 1; i > pass; i--)
            if (c.compare(x(i), x(pass)) < 0)
            {
               int temp = x(i);
               x(i) = x(pass);
               x(pass) = temp;
            }
   }
}

Le main() la méthode révèle deux appels à son compagnon sort() méthode qui trie un tableau d'entiers via l'algorithme Bubble Sort. Chaque appel reçoit un tableau d'entiers comme premier argument et une référence à un objet créé à partir d'un Comparer sous-classe comme deuxième argument. Le premier appel réalise un tri par ordre croissant en soustrayant y depuis x; le deuxième appel réalise un tri par ordre décroissant en soustrayant x depuis y.

Compilez les listes 7 et 8 comme suit :


javac *.java

Lorsque vous compilez une classe dont la méthode contient une classe anonyme, le compilateur crée un fichier de classe pour la classe anonyme dont le nom se compose du nom de la classe englobante, d'un signe dollar et d'un entier qui identifie de manière unique la classe anonyme. Dans ce cas, la compilation aboutit à ACDemo$1.class et ACDemo$2.class en plus de ACDemo.class.

Exécutez l’application comme suit :


java ACDemo

Vous devriez observer le résultat suivant :


10 30 5 0 -2 100 -9
-9 -2 0 5 10 30 100
100 30 10 5 0 -2 -9

Exemple : Utilisation de classes anonymes avec un gestionnaire d'événements AWT

Les classes anonymes peuvent être utilisées avec de nombreux packages dans la bibliothèque de classes standard. Pour cet exemple, nous utiliserons une classe anonyme comme gestionnaire d'événements dans Abstract Windowing Toolkit ou Swing Windowing Toolkit. Le fragment de code suivant enregistre un gestionnaire d'événements avec Swing JButton classe, qui se trouve dans le javax.swing emballer. JButton décrit un bouton qui exécute une action (dans ce cas, l'impression d'un message) lorsqu'il est cliqué.


JButton btnClose = new JButton("close");
btnClose.addActionListener(new ActionListener()
                               {
                                  public void actionPerformed(ActionEvent ae)
                                  {
                                     System.out.println("close button clicked");
                                  }
                               });

La première ligne instancie JButtonen passant close comme l'étiquette du bouton JButtonLe constructeur de . La deuxième ligne enregistre un écouteur d'action avec le bouton. L'écouteur d'action actionPerformed() La méthode est invoquée à chaque fois que le bouton est cliqué. L'objet passé à addActionListener() est instancié à partir d'une classe anonyme qui implémente le java.awt.event.ActionListener interface.

A Lire aussi  Volkswagen livre ses ID.4 sans pompe à chaleur à cause de la pénurie de semi-conducteurs

Conclusion

Les capacités d'imbrication de Java vous aident à organiser les types de référence de niveau inférieur. Pour les types de référence de niveau supérieur, Java fournit des packages. Java 101 Le didacticiel vous présente les packages et les importations statiques en Java.

Plus de cet auteur

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

GIPHY App Key not set. Please check settings

Visite de Courtoisie : Le Chef Supérieur du Canton Akwa chez le PM

Visite de Courtoisie : Le Chef Supérieur du Canton Akwa chez le PM

la tenniswoman Caroline Garcia dénonce les messages de haine de parieurs

la tenniswoman Caroline Garcia dénonce les messages de haine de parieurs