Dependencia del orden del constructor de herencia de clase Java

Cuando Java hereda una clase y crea un objeto de subclase, la secuencia de ejecución es la siguiente:

1. Asigne memoria para todos los campos de la subclase e inicialice los valores predeterminados (incluidos los heredados de la clase principal) y luego ejecute el constructor (si no está definido, ejecute el constructor predeterminado sin argumentos)

2. La ejecución de cada constructor pasará por tres etapas (tenga en cuenta que este es un proceso recursivo):

    2.1 Llamar explícitamente (super) al constructor de la clase padre o llamar implícitamente al constructor sin argumentos de la clase padre. Si se llama explícitamente a este constructor, la cadena de llamadas se ejecutará hasta que se encuentre una llamada de constructor de clase padre explícita o implícita.

    2.2 Inicializar campos usando inicializadores o cualquier bloque de inicialización

    2.3 Ejecutando el cuerpo del constructor

Veamos un ejemplo:

A.java:

package study;


public class A {
	A()
	{
		System.out.println("A()");
		this.testpublic();
		this.testprivate();
	}
	A(int i)
	{
		System.out.println("A("+i+")");
		testpublic();
	}
	public void testpublic()
	{
		System.out.println("A.testpublic()");
	}
	private void testprivate()
	{
		System.out.println("A.testprivate()");
	}
}

B.java

package study;


public class B extends A {
	B(){
		this(4);
		System.out.println("B()");
	}
	B(int i)
	{
		System.out.println("B("+i+")");
	}
	public void testpublic()
	{
		System.out.println("B.testpublic()");
	}
	public void testprivate()
	{
		System.out.println("B.testprivate()");
	}
}

Principal.java

package study;

public class Main {
	public static void main(String argv[])
	{
		A b = new B();
		b.testpublic();
	}
}

Primero puede pensar cuál será el resultado de la ejecución. Aquí está el resultado de la ejecución del programa:


B()->B(4)->A()->B(4)->B()

Podemos ver que este es un proceso recursivo, de hecho aquí se ignora la fase de ejecución de A(), A se hereda de la clase Object por defecto, es decir, el constructor de A seguirá llamando a la clase padre recursivamente Constructor de objetos, hasta la clase de nivel superior.

También vimos la naturaleza del polimorfismo de Java a nivel de constructor. Presta atención a la diferencia entre público y privado aquí. En cuanto a las razones específicas, aún no he aclarado. Si alguien sabe, ¡espero dar consejos!


Supongo que te gusta

Origin blog.csdn.net/g1093896295/article/details/79984698
Recomendado
Clasificación