Maison  >  Article  >  Java  >  Explication détaillée des fermetures et des rappels entre les classes internes Java

Explication détaillée des fermetures et des rappels entre les classes internes Java

高洛峰
高洛峰original
2017-01-24 11:55:131474parcourir

Avant-propos

Une fermeture est un objet appelable qui enregistre certaines informations de la portée dans laquelle il a été créé. Grâce à cette définition, nous pouvons voir que la classe interne est une fermeture orientée objet, car elle contient non seulement des informations sur l'objet de la classe externe (la portée dans laquelle la classe interne est créée), mais a également automatiquement une référence à cette classe externe. objet, dans ce cadre, la classe interne a le droit d'exploiter tous les membres, y compris les membres privés.

L'un des problèmes les plus controversés de Java est la conviction que Java devrait inclure une sorte de mécanisme de type pointeur pour permettre les rappels. Grâce aux rappels, un objet peut transporter des informations qui lui permettent d'appeler l'objet d'origine ultérieurement. Si le rappel est implémenté via un pointeur, alors on ne peut qu'espérer que le programmeur n'utilisera pas le pointeur à mauvais escient.

1. Classe interne membre

Une classe interne peut être considérée comme un membre. Une classe interne membre peut accéder sans condition à toutes les propriétés membres et méthodes membres de la classe externe.

class OutterClass {//外部类
 private int in = 0;
 static int inn=4;
 public OutterClass(int in) {
   this.in = in;
 }
 class InnerClass {   //内部类
   public void output() {
     System.out.println(in);
     System.out.println(inn);
   }
 }
}

Lorsqu'une classe interne membre a une variable ou une méthode membre portant le même nom que la classe externe, par défaut, le membre de la classe interne membre est accessible. Si vous souhaitez accéder à un membre de la classe externe du même nom, vous devez y accéder sous la forme suivante :

OutterClass(外部类).this.成员

Lorsqu'une classe externe accède à une classe interne, vous devez d'abord créer un objet de la classe interne du membre, puis transmettre à Access une référence à cet objet.

class OutterClass {
 private int in = 0;
 static int inn=4;
 public OutterClass(int in) {
   InnerClass inner=new InnerClass();
   this.in=inner.innerNum;
 }
 class InnerClass {  //内部类
   public int innerNum=1;
   public void output() {
     System.out.println(in);
     System.out.println(inn);
     int a=OutterClass.this.inn;
   }
 }
}

La classe interne membre existe en fonction de la classe externe, c'est-à-dire que si vous souhaitez créer un objet de la classe interne membre, le principe est qu'il doit y en avoir. être un objet de la classe externe. La manière générale de créer des objets de classe interne membre est la suivante :

public class classa {
 public static void main(){
   OutterClass oc=new OutterClass(3);
   OutterClass.InnerClass in=oc.new InnerClass();
 }
}

2. Classe interne locale

Une classe interne locale est comme une classe interne locale partie dans une méthode Tout comme les variables, elles ne peuvent pas avoir de modificateurs publics, protégés, privés et statiques.

class OutterClass {
 public OutterClass(int in) {
   class InnerClass {  //局部内部类
      int innerNum=1;
   }
 }
}

3. Classes internes imbriquées

Les classes internes imbriquées sont des classes internes modifiées comme statiques. Une classe interne déclarée comme statique ne nécessite pas de connexion entre l'objet de classe interne et l'objet de classe externe, ce qui signifie que nous pouvons référencer directement external.inner, c'est-à-dire qu'il n'est pas nécessaire de créer une classe externe ou une classe interne.

class OutterClass {
 public OutterClass(int in) {   
 }
 static class InnerClass {  //局部内部类
   int innerNum=1;
 }
}
public class classa {
 public static void main(){
   OutterClass.InnerClass in=new OutterClass.InnerClass();
 }
}

4. Classes internes anonymes

Les classes internes anonymes sont ce que nous utilisons le plus, car nous ne voulons pas leur donner de nom. , donc il y a Anonyme. Les classes internes anonymes doivent être définies à l'avance.

btnSan.setOnClickListener(newOnClickListener() {
  @Override
  publicvoidonClick(View v) {
  }
});

5. Fermetures et rappels

Une fermeture (Closure) est un objet qui peut être appelé. Il enregistre l'objet qui l'a créé. Informations sur la portée. JAVA ne prend pas explicitement en charge les fermetures, mais dans JAVA, les fermetures peuvent être implémentées via des « classes internes d'interface ».

Par exemple : un programmeur d'interface et un rédacteur de classe de base ont tous deux le même travail de méthode et le même nom de méthode, mais leurs significations sont complètement différentes. Dans ce cas, des fermetures sont nécessaires.

class Writer {//作家基类
 void work(){};
}
interface programmer{//程序员接口
 void work();
}

Le code d'implémentation de la fermeture est le suivant :

public class WriterProgrammer extends Writer {
 @Override
 public void work(){
   //写作
 }
 public void code(){
   //写代码
 }
 class ProgrammerInner implements programmer{
   @Override
   public void work(){
     code();
   }
 }
}

Une classe interne qui suit les règles de l'interface du programmeur est définie dans la sous-classe, puis utilisez la classe interne pour implémenter la méthode code() de rappel de la méthode work() du programmeur, et implémentez directement la méthode work() de l'auteur de la classe parent dans la sous-classe.

6. Le rôle des classes internes

Les classes internes peuvent être bien cachées.

Les classes générales non internes ne sont pas autorisées à avoir des autorisations privées et protégées, mais les classes internes peuvent

Les classes internes ont des autorisations d'accès à tous les éléments de la classe externe

Mais implémenter l'héritage multiple

peut éviter de modifier l'interface et d'appeler deux méthodes du même nom dans la même classe.

7. Résumé

Ce qui précède est l'intégralité du contenu de cet article. J'espère qu'il sera utile à tout le monde pour apprendre ou utiliser Java. Si vous avez des questions, vous pouvez laisser un message. pour communiquer.

Pour des explications plus détaillées sur les fermetures et les rappels entre les classes internes Java, veuillez faire attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn