De una instancia a ver mecanismo de carga de clases de Java

Un ejemplo

Hoy en día, un código de este tipo en el estudio:

public class debug{

	// b 的定义
	Thread b;
	public debug(){
		Thread a=new Thread(new Runnable(){
			int count=0;
			public void run() {
				while(true) {
					count++;
					System.out.println("a进程");
					try {
						Thread.sleep(2000);
						System.out.println("222");

						// b的使用,调用其join方法,使其他线程等待b执行完再执行
						b.join();
						System.out.println("333");
					}catch(Exception e) {
						e.printStackTrace();
					}
					if(count==5) {
						break;
					}
				}
			}
		});
		a.start();

		//b的初始化
		b=new MyThread();
		b.start();
		System.out.println("主进程");
	}
	public static void main(String[] args) {
		new debug();
	}
	
	class MyThread extends Thread{
		public MyThread() {
			System.out.println(111);
		}
	}
}

Mirada en mi top tres líneas de comentarios, desde el punto de vista de la orden, las miradas código como este hilo B del ciclo de vida es la definición del primer uso, a continuación, inicializar las lógico pensar que se está dando, pero el código anterior no es el problema, su salida como sigue:

111
主进程
a进程
222
333
a进程
222
333
a进程
222
333
a进程
222
333
a进程
222
333

Tenga en cuenta la sentencia de impresión 111y la 222fila, 111la fila B es para marcar el tiempo de inicialización hilo, y 222la línea está marcada b el uso del tiempo, por lo que, al parecer la ejecución de código de fin de ella, algo que estudio en profundidad, se encontró Java mecanismo de carga de clase de la obstaculizado *** ***

mecanismo de carga de clases de Java

clases Java comienzan a ser cargado en la memoria de la máquina virtual, para descargar una memoria el momento, la totalidad de su ciclo de vida, incluyendo: carga (carga), la verificación (verificación), preparación (Preparación), analítica (Resolución), inicializar (inicialización), utilizar (usando) y de descarga (descarga) siete etapas. El que la preparación, verificación, referido como parte analítica 3 conectado (Linking)

Aquí nos centramos sólo está listo, el análisis, la fase de inicialización de fase

Preparación (Preparation)

Fase de preparación se asignaba formalmente memoria para las variables de clase (variables miembro estáticas) y establecer el valor inicial variable de clase (valor cero) de la etapa, la memoria utilizada por estas variables se asignan en el área de método. Este tiempo incluye sólo las variables de clase de asignación de memoria, las variables de instancia sin incluir variables de instancia será asignado junto con el objeto cuando el objeto es instanciado en el montón. En segundo lugar, la "normalmente" hace referencia aquí es el valor inicial del tipo de datos de valor cero, suponiendo una variable de clase se define como:

public static int value = 123;

Entonces, después de que el valor de la variable en el valor de fase de preparación de 0 en lugar de 123. Porque esta vez no se ha iniciado ningún método Java, y se compiló el valor asignado a la instrucción putstatic 123 después del programa, almacenado en un método constructor de la clase () en, por lo que el valor asignado a la acción se llevará a 123 durante la fase de inicialización ejecución. En cuanto a los "casos especiales" significa: cuando el campo de atributo de clase es el campo ConstantValue, inicializado con el valor especificado, entonces se marca como un final, valor del valor en la etapa de preparación 123 se inicializa a 0 en lugar de en la fase de preparación.

public static final int value = 123;

Análisis (Resolución)

Analizar etapa es una máquina virtual a una piscina constante de referencias simbólicas al proceso de reemplazar referencias directas. La operación de análisis principal para la clase o interfaz, campos, métodos de clase, método de interfaz, método de tipo, y llama a la manija método calificadores de clase 7 Puntos por referencias simbólicas.

Inicialización (inicialización)

fase de inicialización de clase es el proceso de carga de clases paso final. En frente de la carga de clases, por adición a la definición de cargador de clases de la participación, la operación restante está totalmente dominado por la máquina virtual en la fase de carga y el control de aplicación de usuario. Para la fase de inicialización, clase java realmente comenzó define en el código del programa (código de bytes).

Durante las variables fase de preparación que han sido asignados a través de los requisitos del sistema del valor inicial (valor cero) una vez, mientras que en la fase de inicialización, para inicializar las variables de clase y otros recursos basado en mono Scheduler subjetiva a través de un programa desarrollado o, más claramente: <font size = 6, color = "red"> fase de inicialización se lleva a cabo durante el método constructor de la clase (). () El método es implementado por la operación compilador de asignación recogidos automáticamente toda clase de variables de clase y las sentencias estáticas bloque de instrucciones estáticas fusión de {}, la colección para el compilador era por orden de aparición en la declaración en el archivo de origen de la decisión las sentencias estáticas sólo pueden acceder al bloque para definir las variables antes de que el bloque estático de los estados, tal como se define en la variable después de que, frente a bloques estáticos pueden ser asignados, pero no se puede acceder. De la siguiente manera:

public class Test{
	static{
    	i=0;
    	System.out.println(i);//Error:Cannot reference a field before it is defined(非法向前引用)
	}
	static int i=1;
}

Por lo que el comentario la línea de código de error, y en las siguientes situaciones, el programa se puede compilar y ser un funcionamiento normal.

public class Test{
	static{
    	i=0;
    	//System.out.println(i);
	}

	static int i=1;

	public static void main(String args[]){
    	System.out.println(i);
	}
}/* Output:	1

constructor de la clase () y constructores de instancia () diferentes, que no requiere que el programador llamar explícitamente, la garantía virtual antes de la ejecución, el constructor de la clase padre () está acabado en una subclase del constructor de la clase (). Debido a que el constructor de la primera implementación de la clase dominante (), los medios bloque de instrucciones de inicialización estáticas que las clases que se definen en las variables estáticas / a dar prioridad a la declaración de inicialización bloque subclase / ejecución estática variables estáticas. En particular, el constructor de la clase () para una clase o interfaz no es esencial, si una clase no es un bloque estático de los estados, no hay ninguna asignación de las variables de clase, el compilador no puede producir para el constructor de la clase de clase ( ).

la creación de objetos de Java

Mirada por encima de la palabra de color rojo muy excitado, que se ha resuelto, pero se dijo anteriormente es la variable estática de clase, y el programa es una variable de instancia. De hecho, el procedimiento anterior se basa en el principio:

<Font size = 6, color = "red"> variables de instancia Ejemplo inicialización bloque inicializa siempre se produce antes de que se inicie la constructor

Código de ejemplo:

public class debug{
	// b 的定义
	Thread b;

	public debug(){
		
		// 构造函数  fourth
		Thread a=new Thread(new Runnable(){
			int count=0;
			public void run() {
				while(true) {
					count++;
					System.out.println("a进程");
					try {
						Thread.sleep(2000);
						System.out.println("222");
						// b的使用,调用其join方法,使其他线程等待b执行完再执行
						b.join();
						System.out.println("333");
					}catch(Exception e) {
						e.printStackTrace();
					}
					if(count==5) {
						break;
					}
				}
			}
		});
		a.start();
		//b的初始化           third
		b=new MyThread();
		b.start();
		System.out.println("主进程");
	}
	
	//实例代码块             second
	{
	System.out.println(1.5);
	}
	//静态代码块             first
	static {
		System.out.println(0.5);
	}
	
	public static void main(String[] args) {
		new debug();
	}
	
	class MyThread extends Thread{
		public MyThread() {
			System.out.println(111);
		}
	}
}

Resultado de muestra:

0.5
1.5
111
a进程
主进程
222
333
a进程
222
333
a进程
222
333
a进程
222
333
a进程
222
333

He llegado a

Cuando la orden de ejecución del código en una nueva instancia de una clase: bloque estático de código> bloque ejemplo> variable de instancia se inicializa (porque las variables estáticas en el tiempo de carga de clase se inicializa, entonces el proceso de inicialización de los estados de inicialización también recogió, y los estados de inicialización la ubicación específica no es tanto (excepto estática / ejemplo bloques de código y constructores) que provoca artefactos anteriores)> constructor.

Publicado 84 artículos originales · ganado elogios 250 · Vistas de 150.000 +

Supongo que te gusta

Origin blog.csdn.net/ygdxt/article/details/88143030
Recomendado
Clasificación