12- clase perfiles de profundidad cargador y la inicialización de clase

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
      
Publicado 12 artículos originales · ganado elogios 0 · Vistas 219

Supongo que te gusta

Origin blog.csdn.net/qq_40574305/article/details/104784486
Recomendado
Clasificación