JavaSE - classes internes statiques

ced485cbb11e458d81a746890b32cf3f.gif

Auteur: Rukawa Maple Knock Code

Page d' accueil du blog : Blog de Rukawa Kaede

Chronique : Apprendre java avec moi

Citation : Restez affamé, restez stupide

Si vous voulez faire de bonnes choses, vous devez d'abord affûter vos outils. Laissez-moi vous présenter un outil super puissant pour gagner des offres de grands fabricants - Niuke.com

Cliquez pour vous inscrire gratuitement et effleurez les questions avec moi  

Annuaire d'articles

1. variable de membre de modificateur statique

2. méthode de membre modifié statique

3. Initialisation de la variable membre statique

4. Classe intérieure

classe interne d'instance

classe interne statique

classe intérieure locale


1. variable de membre de modificateur statique

En Java, les membres modifiés par statique sont appelés membres statiques ou membres de classe. Ils n'appartiennent pas à un objet spécifique et sont partagés par tous les objets. Par exemple, lorsque nous définissons une classe d'élèves, nous devons exprimer Dans la classe où les élèves prennent classes, les attributs de cette classe n'ont pas besoin d'être stockés dans chaque objet étudiant, mais doivent être partagés par tous les étudiants. Dans ce cas, un membre statique partagé par tous les objets doit être défini.

Les variables membres statiques modifiées sont appelées variables membres statiques. La plus grande caractéristique des variables membres statiques est qu'elles n'appartiennent pas à un objet spécifique, mais sont partagées par tous les objets.

Fonctionnalités des variables membres statiques :

1. Il n'appartient pas à un objet spécifique, c'est un attribut d'une classe, partagé par tous les objets et non stocké dans l'espace d'un objet

2. Il est accessible soit via l'objet, soit via le nom de la classe, mais il est généralement recommandé d'utiliser le nom de la classe pour y accéder.

3. Les variables de classe sont stockées dans la zone de méthode

4. Le cycle de vie accompagne la vie de la classe (ie : créé au chargement de la classe, détruit au déchargement de la classe)

public class Class {
    private String name;
    private String gender;
    private int age;
    private  static String classRoom = "A123";

    public static void main(String[] args) {
        //静态成员变量可以直接通过类名访问
        System.out.println(Class.classRoom);

        Class c1 = new Class();
        Class c2 = new Class();
        Class c3 = new Class();
        //也可以通过对象访问:但是classRoom是3个对象共享的
        System.out.println(c1.classRoom);
        System.out.println(c2.classRoom);
        System.out.println(c3.classRoom);
    }
}

 Exécutez le code ci-dessus en mode débogage, puis vous pouvez voir dans la fenêtre du moniteur que les variables de membre statiques ne sont pas stockées dans un objet spécifique

2. méthode de membre modifié statique

En Java, une méthode membre modifiée par static est appelée une méthode membre statique , qui est une méthode d'une classe, non spécifique à un objet. Les membres statiques sont généralement accessibles via des méthodes statiques

public class Class {
    private String name;
    private String gender;
    private int age;
    private  static String classRoom = "A123";
    public static void setClassRoom(String classRoom) {
        Class.classRoom = classRoom;
    }

    public static String getClassRoom() {
        return classRoom;
    }
}

class TestClass{
    public static void main(String[] args) {
        System.out.println(Class.getClassRoom());
    }

}

Sortie : A123 

Fonctionnalités de la méthode statique :

1. Il n'appartient pas à un objet spécifique, c'est une méthode de classe

2. Elle peut être appelée via l'objet ou via le nom de la classe. La méthode statique name (...) method , cette dernière est plus recommandée

3. Vous ne pouvez accéder à aucune variable membre non statique dans une méthode statique

Échec de la compilation : variable non statique qui ne peut pas être référencée à partir d'un contexte statique

'Class.this' ne peut pas être référencé à partir d'un contexte statique

 Échec de la compilation : impossible de référencer l'âge de la variable non statique à partir d'un contexte statique

Le champ non statique 'age' ne peut pas être référencé à partir d'un contexte statique

4. Aucune méthode non statique ne peut être appelée dans des méthodes statiques , car les méthodes non statiques ont ce paramètre et cette référence ne peut pas être transmise lors de l'appel dans des méthodes statiques.

 Erreur de compilation : impossible de référencer la méthode non statique doClass() à partir d'un contexte statique

3. Initialisation de la variable membre statique

Remarque : Les variables de membre statiques ne sont généralement pas initialisées dans le constructeur et les propriétés d'instance liées à l'objet sont initialisées dans le constructeur.

L'initialisation des variables de membre statiques est divisée en deux types : l'initialisation sur place et l'initialisation de bloc de code statique.

1. Initialisation sur place L'initialisation sur place fait référence à : donner la valeur initiale directement au moment de la définition

2. Initialisation du bloc de code statique

Un morceau de code défini avec {} est appelé un bloc de code

Selon la position et les mots clés définis par le bloc de code, il peut être divisé en quatre types :

Bloc de code normal : bloc de code défini dans une méthode.

Les blocs de construction sont également appelés : blocs de code d'instance. Les blocs constructeurs sont généralement utilisés pour initialiser les variables membres d'instance.

Bloc statique : un bloc de code défini à l'aide de statique est appelé un bloc de code statique. Généralement utilisé pour initialiser des variables membres statiques.

Bloc de code synchronisé

class TestClass{
    public TestClass() {
        System.out.println("不带参数的构造方法");
    }

    public static String classes;
    {

        System.out.println("实例代码块");
    }
    static {
        System.out.println("静态代码块");
    }
    public static void main(String[] args) {
        TestClass testClass = new TestClass();
    }

}

 Le bloc de code statique est exécuté en premier, et le bloc de code statique sera exécuté lorsque la classe sera chargée, quel que soit l'ordre du code

 Lorsque nous l'exécuterons à nouveau, le bloc de code statique ne sera plus exécuté, quel que soit le nombre d'objets générés dans le bloc de code statique, il ne sera exécuté qu'une seule fois

Précautions:

Peu importe le nombre d'objets générés dans un bloc de code statique, il ne sera exécuté qu'une seule fois

Les variables de membre statiques sont des propriétés de la classe , donc l'espace est ouvert et initialisé lorsque la JVM charge la classe

Si une classe contient plusieurs blocs de code statiques, lors de la compilation du code, le compilateur s'exécutera (fusionnera) séquentiellement selon l'ordre défini.

Les blocs de code d'instance ne sont exécutés que lorsque l'objet est créé

4. Classe intérieure

Lorsqu'il y a une autre partie d'une chose qui a besoin d'une structure complète pour être décrite, et que cette structure complète interne ne fournit que des services pour des choses externes, alors toute la structure complète interne est préférable d'utiliser une classe interne. En Java, une classe peut être définie à l'intérieur d'une autre classe ou d'une méthode, la première est appelée classe interne et la seconde est appelée classe externe. Les classes internes sont aussi une manifestation de l'encapsulation

public class OutClass{
    class InnerClass{

    }
}
//OutClass是外部类
//InnerClass是内部类

Précautions:

1. Ce qui est défini en dehors de la classe nom de classe {} accolades, même dans un fichier, ne peut pas être appelé une classe interne

public class A{

}
class B{

}
//A和B是两个独立的类,彼此之前没有关系

2. La classe interne et la classe externe partagent le même fichier source Java, mais après compilation, la classe interne formera un fichier bytecode séparé

public class Test {
    public static void main(String[] args) {
        System.out.println("hello");
    }
    class Test1{
        public void test(){

        }
    }
}

Selon l'emplacement de la définition de la classe interne, elle peut généralement être divisée sous les formes suivantes :

1. Classe interne de membres (classe interne ordinaire : classe interne de membres non modifiée par statique et classe interne statique : classe interne de membres modifiée par statique)

2. Classes internes locales (sans parler des modificateurs), classes internes anonymes (introduites lors de l'apprentissage des interfaces)

public class OutClass{

    //成员位置定义:未被static修饰--->实例内部类

    public class InnerClass1{
}

    //成员位置定义:被static修饰--->静态内部类

    static class InnerClass2{
}
    public void method(){

    //方法中也可以定义内部类--->局部内部类:几乎不用

        classInnerClass5{
        }
    }
}

Remarque : les classes internes ne sont pas vraiment utilisées dans le développement quotidien. Vous pouvez rencontrer beaucoup de choses en regardant le code dans certaines bibliothèques. Les classes internes anonymes sont les plus utilisées dans la vie quotidienne.

classe interne d'instance

Autrement dit, une classe interne de membres qui n'est pas modifiée par static

Regardez quatre questions :

1. Comment obtenir l'objet de la classe interne de l'instance ?

OuterClass.InnerClass innerClass = outerClass.new InnerClass();
public class Test {
    //1:如何获取实例内部类的对象
    OuterClass outerClass = new OuterClass();
    //通过外部类对象的引用来调用内部类,可以把实例内部类当作外部类的一个成员
    OuterClass.InnerClass innerClass = outerClass.new InnerClass();

    //两种写法都可
    OuterClass.InnerClass innerClass2 = new OuterClass().new InnerClass();
}
class OuterClass{

    public int data1;
    int data2;
    public static int data3;
    public void test(){
        System.out.println("OuterClass:test");
    }
    //实例内部类
    class InnerClass{

        public int data4;
        int data5;
        //public static int data6;
        public void func(){
            System.out.println("InnerClass:func");
        }
    }
}

2. Pourquoi y a-t-il une erreur ?

 Il ne peut pas y avoir de variables membres statiques dans la classe interne de l'instance. Si elles doivent être définies, elles doivent être modifiées avec final

Static est un membre de la classe définie, il sera exécuté lorsque la classe sera chargée et la classe interne doit être exécutée via la référence de l'objet, il y aura donc une erreur

 final est une constante, similaire à const en C, elle ne peut pas être modifiée après l'initialisation, elle a été définie après la compilation

3. La classe externe et la classe interne ont toutes deux le membre data1, lequel sera imprimé lorsqu'il sera appelé ?

class OuterClass{

    public int data1 = 1;
    int data2 = 2;
    public static int data3 = 3;
    public void test(){
        System.out.println("OuterClass:test");
    }
    //实例内部类
    class InnerClass{

        public int data1 = 4;
        int data5 = 5;
        public static final int data6 = 6;
        public void func(){
            System.out.println("InnerClass:func");

            System.out.println(data1);
            System.out.println(data2);
            System.out.println(data3);
            //System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
        }
    }
}

L'accès est aux membres de la classe interne elle-même

4. Que se passe-t-il si vous souhaitez accéder à la même variable membre dans la classe externe de la classe interne ?

 C'est correct, ou utilisez la référence de la classe externe dans la classe interne de l'instance :

 Utilisez la notation de référence de la classe externe dans la classe interne de l'instance :

System.out.println(OuterClass.this.data1);

Précautions:

1. Tout membre de la classe externe est directement accessible dans la méthode de la classe interne de l'instance

2. L'emplacement de la classe interne de l'instance est le même que celui du membre de la classe externe, il est donc également limité par des qualificatifs d'accès tels que public et privé

3. Lorsque vous accédez aux membres du même nom dans la méthode de classe interne d'une instance, accédez d'abord à la vôtre. Si vous souhaitez accéder aux membres de la classe externe portant le même nom, vous devez : nom de la classe externe.this.members avec le même nom pour accéder

4. L'objet de classe interne de l'instance doit être créé sous la prémisse de l'objet de classe externe

5. La méthode non statique de la classe interne de l'instance contient une référence à l'objet de la classe externe

6. Dans la classe externe, vous ne pouvez pas accéder directement aux membres de la classe interne de l'instance. Si vous souhaitez y accéder, vous devez d'abord créer un objet de la classe interne

classe interne statique

Une classe de membre interne modifiée par static est appelée une classe interne statique

Regardez deux questions :

1. Comment obtenir un objet de classe interne statique ?

OuterClass2.InnerClass2 innerClass2 = new OuterClass2.InnerClass2();
class OuterClass2{

    public int data1 = 1;
    int data2 = 2;
    public static int data3 = 3;
    public void test(){
        System.out.println("OuterClass:test");
    }
    static class InnerClass2{

        public int data1 = 4;
        int data5 = 5;
        public static int data6 = 6;
        public void func(){
            System.out.println("InnerClass2:func");
        }
    }

    public static void main(String[] args) {
        OuterClass2.InnerClass2 innerClass2 = new OuterClass2.InnerClass2();
    }
}

2. Les membres non statiques de la classe externe ne sont pas accessibles dans la classe interne statique. Les membres non statiques de la classe externe ont besoin d'une référence à l'objet de la classe externe pour être accessibles.

Si vous souhaitez visiter :

 Précautions:

1. Dans une classe interne statique, seuls les membres statiques de la classe externe peuvent accéder

2. Lors de la création d'un objet de classe interne statique, vous n'avez pas besoin de créer d'abord un objet de classe externe

classe intérieure locale

Défini dans le corps de la méthode ou {} de la classe externe, ce genre de classe interne ne peut être utilisé qu'à l'endroit où il est défini, généralement utilisé très rarement, voici une brève compréhension du format de syntaxe

public class Test {
    //局部内部类:定义在方法体内部
    // 不能被public、static等访问限定符修饰
    public void method(){
        class InnerClass{

            public void methodInnerClass(){
                System.out.println("hello");
            }

        }
        //只能在该方法体内部使用,其他位置都不能用
        InnerClass innerClass= new InnerClass();
        innerClass.methodInnerClass();
    }

    public static void main(String[] args) {
        //编译失败
        Test.InnerClassinnerClass=null;
    }
}

Précautions:

1. Les classes internes locales ne peuvent être utilisées qu'à l'intérieur du corps de la méthode définie

2. Ne peut pas être modifié par des modificateurs tels que public et static

3. Le compilateur a également son propre fichier de bytecode indépendant, le format de nommage : nom de classe externe $ nom de classe interne.classe

 Une classe correspond à un fichier bytecode

4. Utilisez rarement 

 « Le partage de ce numéro est là, pensez à donner un trois-lien au blogueur, votre soutien est le plus grand moteur de ma création !

ced485cbb11e458d81a746890b32cf3f.gif

 

Je suppose que tu aimes

Origine blog.csdn.net/chenchenchencl/article/details/126179618
conseillé
Classement