JavaSE - clases internas estáticas

ced485cbb11e458d81a746890b32cf3f.gif

Autor: Rukawa Maple Knock Code

Página de inicio del blog: Blog de Rukawa Kaede

Columna: Aprende java conmigo

Cita: Mantente hambriento, mantente tonto

Si quieres hacer cosas buenas, primero debes afilar tus herramientas. Permíteme presentarte una herramienta súper poderosa para ganar ofertas de grandes fabricantes: Niuke.com

Haga clic para registrarse de forma gratuita y aclarar las preguntas conmigo  

Directorio de artículos

1. variable miembro modificador estático

2. método de miembro modificado estático

3. Inicialización de variables miembro estáticas

4. Clase interna

clase interna de instancia

clase interna estática

clase interna local


1. variable miembro modificador estático

En Java, los miembros modificados por static se denominan miembros estáticos o miembros de clase. No pertenecen a un objeto específico y son compartidos por todos los objetos. Por ejemplo, cuando definimos una clase de estudiante, necesitamos expresar En el aula donde los estudiantes toman clases, los atributos de esta clase no necesitan almacenarse en cada objeto estudiante, sino que deben ser compartidos por todos los estudiantes. En este caso, es necesario definir un miembro estático compartido por todos los objetos.

Las variables miembro estáticas modificadas se denominan variables miembro estáticas. La característica más importante de las variables miembro estáticas es que no pertenecen a un objeto específico, sino que son compartidas por todos los objetos.

Características de la variable de miembro estático:

1. No pertenece a un objeto específico, es un atributo de una clase, compartido por todos los objetos y no almacenado en el espacio de un objeto .

2. Se puede acceder a través del objeto o del nombre de la clase, pero generalmente se recomienda usar el nombre de la clase para acceder

3. Las variables de clase se almacenan en el área de método

4. El ciclo de vida acompaña la vida de la clase (es decir: creado con la carga de la clase, destruido con la descarga de la clase)

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);
    }
}

 Ejecute el código anterior en modo de depuración y podrá ver en la ventana del monitor que las variables miembro estáticas no se almacenan en un objeto específico

2. método de miembro modificado estático

En Java, un método miembro modificado por estático se denomina método miembro estático , que es un método de una clase, no específico de un objeto. Generalmente se accede a los miembros estáticos a través de métodos estáticos.

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());
    }

}

Salida: A123 

Características del método estático:

1. No pertenece a un objeto específico, es un método de clase

2. Se puede llamar por el objeto, o por el nombre de la clase, el static method name (...) method , este último es más recomendable

3. No puede acceder a ninguna variable miembro no estática en un método estático

Error de compilación: variable no estática, no se puede hacer referencia a ella desde un contexto estático

No se puede hacer referencia a 'Class.this' desde un contexto estático

 La compilación falló: no se puede hacer referencia a la edad variable no estática del contexto estático

No se puede hacer referencia al campo no estático 'edad' desde un contexto estático

4. No se pueden llamar métodos no estáticos en métodos estáticos , porque los métodos no estáticos tienen este parámetro, y esta referencia no se puede pasar cuando se llama a métodos estáticos.

 Error de compilación: no se puede hacer referencia al método no estático doClass() desde un contexto estático

3. Inicialización de variables miembro estáticas

Nota: Las variables miembro estáticas generalmente no se inicializan en el constructor y las propiedades de instancia relacionadas con el objeto se inicializan en el constructor.

La inicialización de variables miembro estáticas se divide en dos tipos: inicialización en el lugar e inicialización de bloque de código estático

1. Inicialización en el lugar La inicialización en el lugar se refiere a: dar el valor inicial directamente en el momento de la definición

2. Inicialización del bloque de código estático

Un fragmento de código definido con {} se denomina bloque de código.

De acuerdo con la posición y las palabras clave definidas por el bloque de código, se puede dividir en los siguientes cuatro tipos:

Bloque de código normal: Un bloque de código definido en un método.

Los bloques de construcción también se denominan: bloques de código de instancia. Los bloques de constructores se utilizan generalmente para inicializar variables de miembros de instancia.

Bloque estático: un bloque de código definido mediante estático se denomina bloque de código estático. Generalmente se usa para inicializar variables miembro estáticas.

Bloque de código sincronizado

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();
    }

}

 El bloque de código estático se ejecuta primero y el bloque de código estático se ejecutará cuando se cargue la clase, independientemente del orden del código.

 Cuando lo volvamos a ejecutar, el bloque de código estático no se volverá a ejecutar, no importa cuántos objetos se generen en el bloque de código estático, solo se ejecutará una vez

Precauciones:

No importa cuántos objetos se generen en un bloque de código estático, solo se ejecutará una vez

Las variables miembro estáticas son propiedades de la clase , por lo que el espacio se abre y se inicializa cuando la JVM carga la clase.

Si una clase contiene múltiples bloques de código estático, al compilar el código, el compilador ejecutará (combinará) secuencialmente de acuerdo con el orden definido.

Los bloques de código de instancia solo se ejecutan cuando se crea el objeto

4. Clase interna

Cuando hay otra parte de una cosa que necesita una estructura completa para ser descrita, y esta estructura interna completa solo proporciona servicios para cosas externas, entonces es mejor usar toda la estructura interna completa para usar una clase interna. En Java, una clase se puede definir dentro de otra clase o método, la primera se llama clase interna y la segunda se llama clase externa. Las clases internas también son una manifestación de la encapsulación.

public class OutClass{
    class InnerClass{

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

Precauciones:

1. Lo que se define fuera de la clase class name {} corchetes, incluso en un archivo, no se puede llamar una clase interna

public class A{

}
class B{

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

2. La clase interna y la clase externa comparten el mismo archivo fuente de Java, pero después de la compilación, la clase interna formará un archivo de código de bytes separado

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

        }
    }
}

De acuerdo con la ubicación de la definición de clase interna, generalmente se puede dividir en las siguientes formas:

1. Clase interna de miembro (clase interna ordinaria: clase interna de miembro no modificada por estática y clase interna estática : clase interna de miembro modificada por estática)

2. Clases internas locales (sin hablar de modificadores), clases internas anónimas (introducidas al aprender interfaces)

public class OutClass{

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

    public class InnerClass1{
}

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

    static class InnerClass2{
}
    public void method(){

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

        classInnerClass5{
        }
    }
}

Nota: Las clases internas en realidad no se usan mucho en el desarrollo diario. Es posible que encuentre muchas al mirar el código en algunas bibliotecas. Las clases internas anónimas son las más utilizadas en la vida diaria.

clase interna de instancia

Es decir, una clase interna miembro que no se modifica por estática

Mira cuatro preguntas:

1. ¿Cómo obtener el objeto de la clase interna de la instancia?

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. ¿Por qué hay un error?

 No puede haber variables miembro estáticas en la clase interna de la instancia.Si deben definirse, deben modificarse con final

Static es un miembro de la clase definida, se ejecutará cuando se cargue la clase y la clase interna debe ejecutarse a través de la referencia del objeto, por lo que habrá un error.

 final es una constante, similar a const en C, no se puede modificar después de la inicialización, se ha establecido después de la compilación

3. Tanto la clase externa como la clase interna tienen el miembro data1, ¿cuál se imprimirá cuando se llame?

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);
        }
    }
}

El acceso es a los miembros de la propia clase interna.

4. ¿Qué sucede si desea acceder a la misma variable miembro en la clase externa en la clase interna?

 Esto está bien, o use la referencia de la clase externa en la clase interna de la instancia:

 Use la notación de referencia de la clase externa en la clase interna de la instancia:

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

Precauciones:

1. Se puede acceder directamente a cualquier miembro de la clase externa en el método de la clase interna de la instancia.

2. La ubicación de la clase interna de la instancia es la misma que la del miembro de la clase externa, por lo que también está restringida por calificadores de acceso como público y privado.

3. Al acceder a los miembros del mismo nombre en el método de clase interna de una instancia, primero acceda al suyo propio. Si desea acceder a los miembros de la clase externa con el mismo nombre, debe: nombre de la clase externa.este.miembros con el mismo nombre para acceder

4. El objeto de clase interno de la instancia debe crearse bajo la premisa del objeto de clase externo

5. El método no estático de la clase interna de la instancia contiene una referencia al objeto de la clase externa

6. En la clase externa, no puede acceder directamente a los miembros de la clase interna de la instancia.Si desea acceder, primero debe crear un objeto de la clase interna

clase interna estática

Una clase de miembro interno modificada por estática se denomina clase interna estática

Mira dos preguntas:

1. ¿Cómo obtener un objeto de clase interno estático?

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. No se puede acceder a los miembros no estáticos de la clase externa en la clase interna estática. Los miembros no estáticos de la clase externa necesitan una referencia al objeto de la clase externa para poder acceder.

Si quieres visitar:

 Precauciones:

1. En una clase interna estática solo se puede acceder a miembros estáticos en la clase externa

2. Al crear un objeto de clase interno estático, no necesita crear primero un objeto de clase externo

clase interna local

Definido en el cuerpo del método o {} de la clase externa, este tipo de clase interna solo se puede usar en el lugar donde se define, generalmente se usa muy raramente, aquí hay una breve comprensión del formato de sintaxis

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;
    }
}

Precauciones:

1. Las clases internas locales solo se pueden usar dentro del cuerpo del método definido

2. No se puede modificar con modificadores como public y static

3. El compilador también tiene su propio archivo de código de bytes independiente, el formato de nomenclatura: nombre de clase externa $ nombre de clase interna.clase

 Una clase corresponde a un archivo de bytecode

4. Raramente uso 

 "El intercambio de este problema está aquí, recuerda darle al blogger un enlace de tres, ¡tu apoyo es la mayor fuerza impulsora para mi creación!

ced485cbb11e458d81a746890b32cf3f.gif

 

Supongo que te gusta

Origin blog.csdn.net/chenchenchencl/article/details/126179618
Recomendado
Clasificación