Registros de autoaprendizaje de Java4Android (23): clases internas y clases internas anónimas

El camino tiene obstáculos y es largo, y la línea se acerca. Mantén la cabeza baja y trabaja duro, si no hablas, ¡serás un éxito de taquilla! ¡Vamos, Sao Nian!

Directorio e índice de recursos

  Índice de recursos y catálogo de procesos de autoaprendizaje Java4Android

1 ¿Qué es una clase interna?

  Clase interna: una clase se define dentro de otra clase, por lo que esta clase se llama clase interna; el ejemplo de código es el siguiente:

class A
{
    
    
    class B
    {
    
    
        
	}
}

  Si compila directamente en este momento, ¿cuál será el resultado de la compilación? Habrá 2 archivos de clase después de la compilación, como se muestra a continuación:
imagen-20200526224829631

  Entre ellos, A $ B.class es el archivo de clase generado por la clase interna;

  El nombre compilado de la clase interna es:Nombre de la clase externa $ Nombre de la clase interna.

2 ¿Cuáles son las características gramaticales de las clases internas?

2.1 ¿Cómo generar objetos de clase internos?

  Todavía use el archivo de clase anterior, en este momento cree una nueva clase para almacenar la función principal, el contenido del programa es el siguiente:

class Test
{
    
    
	public static void main(String args[]) 
	{
    
    
		A a = new A();				// 生成类A 对象
		
		A.B b = new A().new B();	// 生成子类B 对象
	}
}

2.2 Cómo usar variables / funciones internas de miembros de clase

  Primero modificamos el archivo de clase en la primera sección y le agregamos algunas variables miembro para probar. El código específico es el siguiente:

class A 
{
    
    
	int i;
	
	class B 
	{
    
    
		int j;
		
		int funB()
		{
    
    
			int result = i + j;
			System.out.println(result);		// 添加result打印,调试用
			return result;
		}
	}
}

  En este momento, modifique la función principal, asigne valores a las variables miembro en clase A y clase B, y vea el resultado de salida de la función.

class Test
{
    
    
	public static void main(String args[]) 
	{
    
    
		A a = new A();				// 生成类A 对象
		
		A.B b = a.new B();			// 生成子类B 对象
		
		a.i = 3;
		b.j = 1;
		b.funB();
	}
}

  Después de compilar y ejecutar el código anterior, el resultado es el siguiente:
imagen-20200526230400661

  Del análisis del código y los resultados de la ejecución:

  • La clase interna puede usar las variables miembro definidas por la clase externa a voluntad.
  • B es una clase interna de A, lo que significa que las variables miembro y las funciones miembro en A se pueden usar en B a voluntad, pero esto no significa que B hereda A, pero puede usarse, pero B no posee estas variables miembro.
  • Cada objeto de una clase interna está asociado con un objeto de una clase externa. En otras palabras, si hay un objeto de clase interno, debe haber un objeto de clase externo asociado a él.
  • La variable que realmente utilicé en la clase interna B es la variable miembro en la clase externa.

3 clase interna anónima

  Clase interna anónima: la primera es la clase interna, y luego no hay nombre, se llama la clase interna anónima;

  Use el código específico a continuación para implementar, cree una nueva interfaz clase A

interface A 
{
    
    
	public void doSomething();
}

  Luego defina una clase B

class B 
{
    
    
	public void fun(A a)
	{
    
    
		System.out.println("B类的fun函数");
		a.doSomething();
	}
}

  En este momento, la clase B necesita un objeto de tipo A. Como parámetro, también necesita una subclase de la interfaz A, porque A no puede generar objetos directamente, como sigue:

class AImpl implements A 
{
    
    
	public void doSomething()
	{
    
    
		System.out.println("doSomething");
	}
}

  La función principal está ligeramente modificada en este momento, el código específico es el siguiente:

class Test
{
    
    
	public static void main(String args[]) 
	{
    
    
		AImpl al = new AImpl();	// 生成子类对象
		A a = al;				// 向上转型
		
		B b = new B();
		b.fun(a);				// 传进去类型为A的参数
	}
}

  Los resultados de compilación y ejecución del código anterior son los siguientes:
imagen-20200526232124996

  Tenga en cuenta que si se utilizan clases internas anónimas en este momento, habrá una forma inusual de escribir. Modifique el código de la función principal de la siguiente manera:

class Test
{
    
    
	public static void main(String args[]) 
	{
    
    
		// AImpl al = new AImpl();	// 生成子类对象
		// A a = al;				// 向上转型
		
		B b = new B();
		b.fun(new A()
			{
    
    
				public void doSomething()
				{
    
    
					System.out.println("匿名内部类");
				}
			}
		);
	}
}

  Después de volver a compilar el código anterior, el resultado de ejecución es el siguiente:

  El análisis del código de clase interno anónimo y los resultados de la compilación es el siguiente:

  • La función divertida de la clase B requiere un objeto de tipo A, que es básicamente similar al AImpl anterior, pero sin nombre;
  • new A () no se puede usar directamente, debe seguir la clase que implementa la interfaz, pero sin un nombre, se llama clase anónima;

4 resumen

  1. Comprender las clases internas, las características gramaticales básicas de las clases internas, los métodos de implementación, etc .;
  2. Comprender el uso y el alcance de las variables de miembros de clases internas y las funciones de miembros;
  3. Una breve comprensión de las clases internas anónimas, las características y los métodos de implementación.

Si el contenido del artículo es incorrecto, comente / envíe un mensaje privado con muchos consejos, ¡gracias! Si crees que el contenido del artículo no es malo, deja un me gusta, tu me gusta es mi mayor aliento, ¡gracias!

Supongo que te gusta

Origin blog.csdn.net/Fighting_Boom/article/details/106368055
Recomendado
Clasificación