Explicación detallada del orden de carga de bloque estático y variable estática en JAVA

Blog de origen: https://www.cnblogs.com/leiqiannian/p/7922824.html

public class test {                         //1.第一步,准备加载类
<span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public</span> </span><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">static</span> </span><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">void</span> </span><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">main</span>(<span class="hljs-params">String[] args</span>) </span>{
    <span class="hljs-keyword"><span class="hljs-keyword">new</span> test();                         <span class="hljs-comment"><span class="hljs-comment">//4.第四步,new一个类,但在new之前要处理匿名代码块        </span>
}

<span class="hljs-keyword"><span class="hljs-keyword">static</span> <span class="hljs-keyword"><span class="hljs-keyword">int</span> num = <span class="hljs-number"><span class="hljs-number">4</span>;                    <span class="hljs-comment"><span class="hljs-comment">//2.第二步,静态变量和静态代码块的加载顺序由编写先后决定 </span>

{
    num += <span class="hljs-number"><span class="hljs-number">3</span>;
    System.<span class="hljs-keyword"><span class="hljs-keyword">out</span>.println(<span class="hljs-string"><span class="hljs-string">"b"</span>);           <span class="hljs-comment"><span class="hljs-comment">//5.第五步,按照顺序加载匿名代码块,代码块中有打印</span>
}

<span class="hljs-keyword"><span class="hljs-keyword">int</span> a = <span class="hljs-number"><span class="hljs-number">5</span>;                             <span class="hljs-comment"><span class="hljs-comment">//6.第六步,按照顺序加载变量</span>

{ <span class="hljs-comment"><span class="hljs-comment">// 成员变量第三个</span>
    System.<span class="hljs-keyword"><span class="hljs-keyword">out</span>.println(<span class="hljs-string"><span class="hljs-string">"c"</span>);           <span class="hljs-comment"><span class="hljs-comment">//7.第七步,按照顺序打印c</span>
}

test() { <span class="hljs-comment"><span class="hljs-comment">// 类的构造函数,第四个加载</span>
    System.<span class="hljs-keyword"><span class="hljs-keyword">out</span>.println(<span class="hljs-string"><span class="hljs-string">"d"</span>);           <span class="hljs-comment"><span class="hljs-comment">//8.第八步,最后加载构造函数,完成对象的建立</span>
}

<span class="hljs-keyword"><span class="hljs-keyword">static</span> {                              <span class="hljs-comment"><span class="hljs-comment">// 3.第三步,静态块,然后执行静态代码块,因为有输出,故打印a</span>
    System.<span class="hljs-keyword"><span class="hljs-keyword">out</span>.println(<span class="hljs-string"><span class="hljs-string">"a"</span>);
}

<span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">static</span> </span><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">run</span>(<span class="hljs-params"></span>)                    </span><span class="hljs-comment"><span class="hljs-function"><span class="hljs-comment">// 静态方法,调用的时候才加载// 注意看,e没有加载</span>
</span>{
    System.<span class="hljs-keyword"><span class="hljs-keyword">out</span>.println(<span class="hljs-string"><span class="hljs-string">"e"</span>);
}

}

Orden general: bloque estático (variable estática) -> variable miembro -> método de construcción -> método estático 
1. Bloque de código estático (cargar solo una vez) 2. Método de construcción (cargar una vez cuando se crea una instancia) 3. Método estático Necesita ser llamado a ejecutar, por lo que el resultado final no tiene e 
Escriba la descripción de la imagen aquí

Escriba la descripción de la imagen aquí

 public class Print {
 <span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public</span> </span><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">Print</span>(<span class="hljs-params">String s</span>)</span>{
     System.<span class="hljs-keyword"><span class="hljs-keyword">out</span>.print(s + <span class="hljs-string"><span class="hljs-string">" "</span>);
 }

}

 public class Parent{

     public static Print obj1 = new Print("1"); public Print obj2 = new Print("2"); public static Print obj3 = new Print("3"); static{ new Print("4"); } public static Print obj4 = new Print("5"); public Print obj5 = new Print("6"); public Parent(){ new Print("7"); } }
 public class Child extends Parent{ static{ new Print("a"); } public static Print obj1 = new Print("b"); public Print obj2 = new Print("c"); public Child (){ new Print("d"); } public static Print obj3 = new Print("e"); public Print obj4 = new Print("f"); public static void main(String [] args){ Parent obj1 = new Child (); Parent obj2 = new Child (); } }

 

执行main方法,程序输出顺序为: 1 3 4 5 a b e 2 6 7 c f d 2 6 7 c f d 

El resultado de salida muestra que el orden de ejecución del programa es: 
Si la clase no se ha cargado: 
1. El bloque de código estático y la inicialización de la variable estática de la clase principal se ejecutan primero, y el orden de ejecución del bloque de código estático y estático. La variable solo está relacionada con el orden en que aparece el código.  
2. Ejecute el bloque de código estático y la inicialización de la variable estática de la subclase.  
3. Ejecutar la variable de instancia inicialización de la  
clase padre 4. Ejecutar el constructor de la clase padre  
5. Ejecutar la variable de instancia inicialización de la  
. Clase hija 6. Ejecutar el constructor de la clase hija. 

Si la clase se ha cargado: 
la El bloque de código estático y las variables estáticas no necesitan repetirse. Al ejecutar y luego crear un objeto de clase, solo se ejecutan los métodos de inicialización y construcción de variables relacionados con la instancia.

Supongo que te gusta

Origin blog.csdn.net/qq_41936224/article/details/108822166
Recomendado
Clasificación