cargador de clases de perfiles de profundidad y la inicialización de clase
-
Ejemplo uno:
-
A partir de los resultados operativos de vista, FinalTest no se ha inicializado, x = 3 solamente en tiempo de compilación en una piscina constante de FinalTest!
-
Si public static final int x = 3; a :. estática Pública final int x = new Random () Int (3), declaraciones de bloques estáticos también se emite, el FinalTest sido inicializado.
class FinalTest{ public static final int x = 3 ; static{ System.out.println("FinalTest static block"); } } public class MyTest8 { public static void main(String[] args) { System.out.println(FinalTest.x); } } 运行结果: 3
-
-
Ejemplo 2:
-
Nada mal con un análisis cuidadoso! !
class Parent{ static int a = 3 ; static{ System.out.println("Parent static block"); } } class Child extends Parent{ static int b = 4 ; static{ System.out.println("Child static block"); } } public class MyTest9 { static{ System.out.println("MyTest9 static block"); } public static void main(String[] args) { System.out.println(Child.b); } } 运行结果: MyTest9 static block Parent static block Child static block 4
-
-
Tres ejemplos:
-
Debido parent2 = new parent2 ();, la clase padre se ha inicializado, por lo que no dicen, en la inicialización Niño2 volver al inicializar parent2 e implementación System.out.println ( "bloque estático parent2");
class Parent2{ static int a = 3 ; static{ System.out.println("Parent2 static block"); } } class Child2 extends Parent2{ static int b = 4 ; static{ System.out.println("Child2 static block"); } } public class MyTest10 { static{ System.out.println("MyTest10 static block"); } public static void main(String[] args) { Parent2 parent2; //从运行结果来看,这里仅仅是声明对类的引用,并不是对该类的主动使用,所以,不会初始化Parent2 System.out.println("=================="); parent2 = new Parent2(); System.out.println("=================="); System.out.println(parent2.a); System.out.println("=================="); System.out.println(Child2.b); } 运行结果: MyTest10 static block ================== Parent2 static block ================== 3 ================== Child2 static block 4
-
-
★★★ Cuatro ejemplos ★★★
-
Los resultados se pueden ver desde Run: Child_3 estático no imprime el bloque de código, es decir, no se ha inicializado Child_3;
-
Si por el nombre de clase de la subclase de acceso a la variable estática de la clase padre o método estático, en esencia, es tomar la iniciativa de utilizar la clase padre, pero no las subclases de uso activo.
class Parent_3{ static int a = 3 ; static{ System.out.println("Parent_3 static block"); } static void doSomething(){ System.out.println("do Something"); } } class Child_3 extends Parent_3{ static int b = 4 ; static{ System.out.println("Child_3 static block"); } } public class MyTest11 { public static void main(String[] args) { System.out.println(Child_3.a); System.out.println("-------------------------"); Child_3.doSomething(); } } 运行结果: Parent_3 static block 3 ------------------------- do Something
-
-
Ejemplos de cinco:
-
loadClass método llama a las cargas de clase cargador de clases de una clase, la clase no se utiliza activamente, y no causa la inicialización de clase.
class CL{ static{ System.out.println("Class CL"); } } public class MyTest12 { public static void main(String[] args) throws Exception { ClassLoader loader = ClassLoader.getSystemClassLoader(); Class<?> clazz = loader.loadClass("Jvm.CL"); System.out.println(clazz); System.out.println("-------------------------"); clazz = Class.forName("Jvm.CL"); //这是反射,这会加载 System.out.println(clazz); } } 运行结果: class Jvm.CL ------------------------- Class CL class Jvm.CL
-