English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Resumen del uso de clases internas en Java

1. ¿Qué es la clase interna?63;

La clase definida dentro de la clase se llama clase interna

 public class Out{
   class In{ //En este momento, In es la clase interna
   } 
}

2. ¿Por qué usar la clase interna?63;

1) Mejora la encapsulación, oculta la clase interna en la clase externa, no permite que otras clases accedan a la clase interna

2) La clase interna puede mejorar la legibilidad y mantenibilidad del código

3. Clasificación de la clase interna

Para la clasificación de la clase interna, se puede comparar con la clasificación de las variables miembro.

Podemos dividir las variables miembro según diferentes modificador o ubicación de definición, en: variable miembro de clase, variable miembro de instancia, variable local.

Si se considera que la clase interna es un miembro de la clase externa, la clase interna puede usar public/por defecto/protected/modificador private. También puede ser static.

Del mismo modo, la clase interna también se divide según el uso de diferentes modificador o la ubicación de la definición, en4Clase:

1) Clase interna de instancia: la clase interna no utiliza static

2) Clase interna estática: la clase interna utiliza static

3) Clase interna local: la clase interna se define dentro de un método

4) Clase interna anónima: solo se puede usar una vez, es una especie de clase interna

3.1Clase interna de instancia:

1) Definición: clase interna de instancia, es decir, la clase interna no utiliza static. Esto significa que la clase interna de instancia pertenece al objeto de la clase externa, no pertenece a la clase externa en sí (análogo a los campos).

2) Crear una clase interna de instancia

//Clase externa
class Outter {
 // Clase interna de instancia: sin usar el modificador static
 class Inner {
 }
}
public class InnerDemo1 {
 public static void main(String[] args) {
 // Crear una clase interna de instancia, sin usar static, pertenece al objeto de la clase externa, por lo tanto, antes de crear una clase interna de instancia, debe existir un objeto de la clase externa.
 Outter out = new Outter();
 // Crear un objeto de la clase interna a través del objeto de la clase externa
 Outter.Inner in = out.new Inner();
 }
}

3)Características:

a. Según el proceso de creación de la clase interna de la instancia, cuando existe un objeto de la clase interna, siempre existe un objeto de la clase externa.

b. La instancia de la clase interna mantiene automáticamente la referencia a la instancia de la clase externa, y la clase interna puede acceder a todos los campos y métodos de la clase externa sin condiciones.

Atención: cuando la clase interna de los miembros tiene variables o métodos con el mismo nombre que la clase externa, se producirá el fenómeno de ocultamiento.

No se puede acceder directamente a los miembros de la clase interna desde la clase externa, se debe crear primero un objeto de la clase interna de los miembros, y luego acceder a través de la referencia de este objeto.

//Clase externa
class Outter {
 private String name = "out";
 private Integer age = 17;
 // Clase interna de instancia: sin usar el modificador static
 class Inner {
 private Integer age = 18; // Fenómeno de ocultamiento, ocultó el age de la clase externa
 Inner() {
  // Características:1. La clase interna de instancia puede acceder directamente a los miembros de la clase externa
  // 2. Cuando la clase interna de instancia y la clase externa tienen campos o métodos con el mismo nombre, se produce el fenómeno de ocultamiento
  System.out.println(name + this.age);// Salida out18
  // En este momento, si se necesita usar el age de la clase externa, la sintaxis es: clase_externa.this.age
  System.out.println(Outter.this.age);// Salida17
 }
 }
}

Resumen: En resumen, es cuestión de la scopes de las variables, el ámbito de los miembros de la clase externa es toda la clase externa, mientras que la clase interna en la clase externa (se puede considerar como el campo de la clase externa), la clase interna naturalmente puede acceder a la clase externa. Mientras que la clase externa tiene que acceder a los miembros de la clase interna, se puede entender así: los miembros de la clase interna pertenecen a la clase interna, son válidos en la clase interna. Si no existe la clase interna, los miembros variables también no existirán. Por lo tanto, la clase externa no puede acceder directamente a los miembros de la clase interna, debe crear primero un objeto de la clase interna miembro, y luego acceder a través de la referencia apuntando a este objeto.

3.2Clase interna estática

1) Definición: La clase interna se define usando el modificador static. Por lo tanto, esta clase interna pertenece a la clase externa en sí, no a la instancia de la clase externa

2) Crear clase interna

//Clase externa
class Outter {
 // Clase interna estática: se usa el modificador static
 static class Inner {
 }
}
public class InnerDemo2 {
 public static void main(String[] args) {
 // Porque la clase interna estática pertenece a la clase externa en sí, se puede acceder directamente a través del nombre de la clase externa (análogo a los campos)
 Outter.Inner in = new Outter.Inner();
 }
}

3)Características:

a. Al crear una instancia de la clase interna, no es necesario crear una instancia de la clase externa.

b. La clase interna estática puede acceder directamente a los miembros estáticos de la clase externa, y si se desea acceder a los miembros de instancia de la clase externa, debe acceder a través del objeto de la clase externa.

Entendimiento simple: los miembros estáticos pertenecen a la clase, los miembros no estáticos pertenecen al objeto. Si se desea acceder a los miembros de instancia (no estáticos) de la clase externa, naturalmente, primero se debe mantener el objeto de la clase externa. Mientras que la creación de la clase interna no requiere el objeto de la clase externa, por lo tanto, si se desea acceder a los miembros de instancia de la clase externa, debe acceder a través del objeto de la clase externa.

c. En la clase interna estática, se pueden definir miembros estáticos y miembros de instancia.

d. La clase de prueba puede acceder directamente a los miembros estáticos de la clase interna completa.

//Clase externa
class Outter {
 static String name = "outter";
 public Integer age = 17;
 // Clase interna estática: se usa el modificador static
 static class Inner {
 Inner() {
  // La clase interna estática puede acceder directamente a los miembros estáticos de la clase externa
  System.out.println(nombre);// Salida outter
  // Para acceder a los miembros de instancia de la clase externa, debe acceder a través de una instancia de la clase externa.
  System.out.println(new Outter().edad);// Salida 17
 }
 }
}

3.3Clase interna local (casi no se usa)

1)Definición: La clase interna definida dentro de un método, su alcance es el método actual, y está al mismo nivel que las variables locales, por lo que la clase interna local solo se puede usar dentro del método.

Atención, la clase interna local es igual que las variables locales dentro del método, no puede tener modificadores public, protected, private ni static.

public class InnerDemo3 {
 public static void main(String[] args) {
 // Clase interna local
 class Inner {
 }
 }
}

2)Características:

a. La clase interna local y la clase interna de instancia no pueden contener miembros estáticos. (La clase interna local pertenece al método, mientras que los miembros estáticos pertenecen a la clase)

b. La clase interna local y la clase interna de instancia pueden acceder a todos los miembros de la clase externa.

c. Las variables locales a las que accede la clase interna local deben estar modificadas con final en Java8es añadido automáticamente implícitamente (azúcar sintáctico).

Razón: Después de que un método se llama y se ejecuta, el marco de pila del método se destruye y el espacio de variables locales dentro del método se destruye completamente. Pero el objeto de la clase interna puede estar aún en la memoria heap, y solo se destruirá cuando ya no haya referencias. En este momento, puede aparecer una situación: la clase interna necesita acceder a una variable local inexistente. Para evitar este problema, utilizamos el modificador final en las variables locales, convirtiéndolas en constantes que permanecen en el espacio de memoria, incluso después de que el método se destruya, la variable local también permanece en la memoria, y el objeto puede seguir holding.

public class InnerDemo3 {
 public static void main(String[] args) {
 int edad = 17;
 final int num = 15;
 // Clase interna local
 class Inner {
  public void test() {
  // Error: No se puede referir a un objeto no-Variable final edad dentro de una clase interna definida en un método diferente
  System.out.println(edad);
  System.out.println(num);// Correcto
  }
 }
 }
}

3.4Clase interna anónima (más utilizada)

1Definición: una clase interna anónima es una clase interna sin nombre, adecuada para clases que se utilizan solo una vez.

2Crear una clase interna anónima:

Las clases internas anónimas no tienen un constructor, pero llaman al constructor de la clase padre. Generalmente, las clases internas anónimas se utilizan para heredar de otras clases o implementar interfaces, y no necesitan agregar métodos adicionales, solo para implementar o sobrescribir métodos.

Atención: las clases internas anónimas deben heredar de una clase padre o implementar una interfaz, pero solo se puede heredar de un padre o implementar una interfaz.

//Definir un interfaz
interface Person {
 public void eat();
}
public class AnonymousDemo {
 public static void main(String[] args) {
 // Uso de clase interna anónima
 Person p = new Person() {
  public void eat() {
  System.out.println("comer algo");
  }
 };
 p.eat();
 }
}

4.Resumen

5.Pregunta de entrevista

public class Outer {
 public void someOuterMethod() {
 // Línea 3
 }
 public class Inner {
 }
 public static void main(String[] argv) {
 Outer o = new Outer();
 // Línea 8
 }
}
/*
 * Which instantiates an instance of Inner63;
A. new Inner(); // En la línea 3
B. new Inner(); // En la línea 8
C. new o.Inner(); // En la línea 8
D. new Outer.Inner(); // En la línea 8
 */

La respuesta A.new Inner(); es equivalente a this.new Inner(); ya existe un objeto de la clase Outer.

line 8 La forma correcta debería ser: o.new Inner();

Esto es todo el contenido de este artículo, esperamos que el contenido de este artículo pueda ayudar a sus estudios o trabajo en cierta medida, y también esperamos que apoyen más a la教程¡!

Declaración: el contenido de este artículo se obtiene de la red, pertenece al autor original, el contenido se contribuye y carga de manera autónoma por los usuarios de Internet, este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de infracción de derechos de autor, le invitamos a enviar un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará