Al acceder a miembros finales estáticos en una clase, ¿se realizará la carga de clases?

La respuesta es: no necesariamente

  • Ejecute el siguiente código:
package com.java.oop;
import java.util.Date;
//-XX:+TraceClassLoading
class ClassDD{
	public static final int count=100;
	public static final String LOCK="LOCK";
    public static final Date date=new Date();
	static {
		System.out.println("static{}");
	}
}
public class TestClassObject09 {
    public static void main(String[] args) {
		System.out.println(ClassDD.count);
		//System.out.println(ClassDD.LOCK);
		//System.out.println(ClassDD.date);
	}
}

resultado de la operación:

...
...
[Loaded com.java.oop.TestClassObject09 from file:/D:/WORKSPACE/JAVASE-V1.01/bin/]
[Loaded sun.launcher.LauncherHelper$FXHelper from C:\Program Files\Java\jre1.8.0_201\lib\rt.jar]
100
[Loaded java.lang.Shutdown from C:\Program Files\Java\jre1.8.0_201\lib\rt.jar]
[Loaded java.lang.Shutdown$Lock from C:\Program Files\Java\jre1.8.0_201\lib\rt.jar]

Análisis: De los resultados en ejecución, se puede ver que ClassDD no está cargado, porque cuando la modificación final estática de la clase es un tipo de datos básico, la inicialización se realizará durante la fase de compilación.

  • Ejecute el siguiente código:
package com.java.oop;
import java.util.Date;
//-XX:+TraceClassLoading
class ClassDD{
	public static final int count=100;
	public static final String LOCK="LOCK";
    public static final Date date=new Date();
	static {
		System.out.println("static{}");
	}
}
public class TestClassObject09 {
    public static void main(String[] args) {
		//System.out.println(ClassDD.count);
		System.out.println(ClassDD.LOCK);
		//System.out.println(ClassDD.date);
	}
}

resultado de la operación

...
...
[Loaded com.java.oop.TestClassObject09 from file:/D:/WORKSPACE/JAVASE-V1.01/bin/]
[Loaded sun.launcher.LauncherHelper$FXHelper from C:\Program Files\Java\jre1.8.0_201\lib\rt.jar]
LOCK
[Loaded java.lang.Shutdown from C:\Program Files\Java\jre1.8.0_201\lib\rt.jar]
[Loaded java.lang.Shutdown$Lock from C:\Program Files\Java\jre1.8.0_201\lib\rt.jar]

Análisis: se puede ver en los resultados en ejecución que ClassDD no está cargado, porque cuando la modificación final estática de la clase es un tipo de cadena, la inicialización se realizará durante la fase de compilación.

  • Ejecute el siguiente código:
package com.java.oop;
import java.util.Date;
//-XX:+TraceClassLoading
class ClassDD{
	public static final int count=100;
	public static final String LOCK="LOCK";
        public static final Date date=new Date();
	static {
		System.out.println("static{}");
	}
}
public class TestClassObject09 {
    public static void main(String[] args) {
		//System.out.println(ClassDD.count);
		//System.out.println(ClassDD.LOCK);
		System.out.println(ClassDD.date);
	}
}

resultado de la operación:

...
...
[Loaded com.java.oop.TestClassObject09 from file:/D:/WORKSPACE/JAVASE-V1.01/bin/]
[Loaded sun.launcher.LauncherHelper$FXHelper from C:\Program Files\Java\jre1.8.0_201\lib\rt.jar]
[Loaded com.java.oop.ClassDD from file:/D:/WORKSPACE/JAVASE-V1.01/bin/]
static{}
...
...
Fri Nov 08 21:54:30 CST 2019

Análisis: se puede ver en los resultados de ejecución anteriores que la clase ClassDD está cargada.

Resumen: Al acceder a los miembros finales estáticos de la clase, la JVM realizará una optimización de compilación en la clase durante la fase de compilación. Cuando la clase tenga tipos de datos básicos y tipos de cadenas modificados por final estático, la inicialización se realizará durante la fase de compilación.

Supongo que te gusta

Origin blog.csdn.net/qianzhitu/article/details/102981151
Recomendado
Clasificación