Maison  >  Article  >  Java  >  Explication détaillée des instances de classe internes des bases de Java

Explication détaillée des instances de classe internes des bases de Java

Y2J
Y2Joriginal
2017-04-27 09:30:421300parcourir

Cet article présente principalement l'explication détaillée et les exemples des classes internes de base Java. Les amis qui en ont besoin peuvent se référer à

L'explication détaillée et les exemples des classes internes de base Java

Les classes internes ne sont pas faciles à comprendre, mais pour parler franchement, une classe contient en fait une autre classe

Tout comme une personne est composée de cerveau, de membres, d'organes et d'autres parties du corps, et les classes internes sont tout à fait Un des organes, comme le cœur : il a aussi ses propres attributs et comportements (sang, battements)

Evidemment, un cœur ne peut pas être représenté ici unilatéralement par des attributs ou des méthodes, mais une classe s'impose

Et le cœur est dans le corps humain, tout comme la classe intérieure est à l'extérieur

Exemple 1 : La structure de base de la classe intérieure

//外部类
class Out {
  private int age = 12;  
  //内部类
  class In {
    public void print() {
      System.out.println(age);
    }
  }
}
 
public class Demo {
  public static void main(String[] args) {
    Out.In in = new Out().new In();
    in.print();
    //或者采用下种方式访问
    /*
    Out out = new Out();
    Out.In in = out.new In();
    in.print();
    */
  }
}

Résultats d'exécution : 12

À partir de l'exemple ci-dessus, il n'est pas difficile de voir que les classes internes endommagent en fait sérieusement une bonne structure de code, mais pourquoi utiliser des classes internes ?

Parce que la classe interne peut utiliser librement les variables membres de la classe externe (y compris privées) sans générer d'objets de la classe externe, c'est le seul avantage de la classe interne

Tout comme le le cœur peut accéder directement au sang du corps, au lieu de prélever du sang par l'intermédiaire d'un médecin

Une fois le programme compilé, deux fichiers .class seront générés, à savoir Out.class et Out$In.class

où $ représente Out dans le programme ci-dessus Celui dans .In.

Out.In in = new Out().new In() peut être utilisé pour générer des objets de classes internes. Il y en a deux. petits points de connaissance auxquels il faut prêter attention dans cette méthode

1. Le Out au début sert à indiquer quelle classe externe l'objet de classe interne doit être généré

2. Il faut être un objet de la classe externe avant que l'objet de la classe interne puisse être généré, car la fonction de la classe interne est d'accéder aux variables membres dans les classes externes

Exemple 2 : Formulaire d'accès aux variables en interne classes

class Out {
  private int age = 12;
   
  class In {
    private int age = 13;
    public void print() {
      int age = 14;
      System.out.println("局部变量:" + age);
      System.out.println("内部类变量:" + this.age);
      System.out.println("外部类变量:" + Out.this.age);
    }
  }
}
 
public class Demo {
  public static void main(String[] args) {
    Out.In in = new Out().new In();
    in.print();
  }
}

Résultats d'exécution :

Variables locales : 14
Variables de classe internes : 13
Variables de classe externes : 12

À partir de l'exemple 1, on peut constater que lorsque la classe interne n'a pas de variables membres et de variables locales portant le même nom, la classe interne accédera directement aux variables membres de la classe externe sans spécifier l'attribut Out.this. name

Sinon, les variables locales de la classe interne écraseront les variables membres de la classe externe

et accéderont aux variables internes de la classe elle-même. Pour accéder aux variables membres de la classe externe, vous devez utiliser le nom de l'attribut Out.this

Exemple 3 : Classe interne statique

class Out {
  private static int age = 12;
   
  static class In {
    public void print() {
      System.out.println(age);
    }
  }
}
 
public class Demo {
  public static void main(String[] args) {
    Out.In in = new Out.In();
    in.print();
  }
}

Résultats d'exécution : 12

Comme vous pouvez le voir, si vous utilisez static pour rendre l'intérieur statique, la classe interne ne peut accéder qu'aux variables membres statiques de la classe externe, ce qui a des limites

Deuxièmement, parce que la classe interne est statique, Out.In peut être vu dans son ensemble et l'objet de la classe interne peut être directement nouveau (accès statique via le nom de la classe, peu importe si l'objet de la classe externe est généré ou pas)

Exemple 4 : Classe interne privée

class Out {
  private int age = 12;
   
  private class In {
    public void print() {
      System.out.println(age);
    }
  }
  public void outPrint() {
    new In().print();
  }
}
 
public class Demo {
  public static void main(String[] args) {
    //此方法无效
    /*
    Out.In in = new Out().new In();
    in.print();
    */
    Out out = new Out();
    out.outPrint();
  }
}

Résultat d'exécution : 12

Si une classe interne veut uniquement être inclus dans une opération de méthode de classe externe, alors vous pouvez utiliser private pour déclarer la classe interne

Dans le code ci-dessus, nous devons générer un objet de la classe In dans la classe Out pour l'opération, et nous ne pouvons plus utiliser Out.In in = new Out(). new In() génère un objet de la classe interne

En d'autres termes, la classe interne à ce moment ne peut être contrôlée que par la classe externe.

Par exemple, mon cœur ne peut être contrôlé que par mon corps, les autres humains ne peuvent pas y accéder directement

Exemple 5 : Méthode classe interne

class Out {
  private int age = 12;
 
  public void Print(final int x) {
    class In {
      public void inPrint() {
        System.out.println(x);
        System.out.println(age);
      }
    }
    new In().inPrint();
  }
}
 
public class Demo {
  public static void main(String[] args) {
    Out out = new Out();
    out.Print(3);
  }
}

Résultat d'exécution :

3
12

Dans le code ci-dessus, nous avons déplacé la classe interne vers la méthode de la classe externe, puis généré un objet de classe dans la méthode de la classe externe pour appeler la méthode de la classe interne

Si nous devons transmettre des paramètres dans la méthode de la classe externe à ce moment-là, alors les paramètres de la méthode de la classe externe doivent être définis en utilisant final

Quant à final, il n'y a pas de signification particulière ici, c'est juste une forme d'expression.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en 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