10- inicialización para similitudes y diferencias entre las clases y las interfaces de análisis en profundidad

Inicialización de similitudes y diferencias entre las clases y las interfaces de análisis en profundidad

  • ★★★ Cuando la máquina virtual de Java para inicializar una clase, pidiéndole que la totalidad de la clase padre han sido inicializado, sin embargo, esta regla no se aplica a la interfaz

    • (1) Cuando se inicializa una clase, y no se inicializa las interfaces que implementa. Allí abajo [para demostrar]

    • (2) se inicializa en una interfaz, no inicializado su interfaz padres. Allí abajo [para demostrar]

      • De este modo, un padre no porque es una inicialización de interfaz y sub-clase o interfaz implementado inicializado. Sólo cuando el programa utilice primero las variables estáticas de interfaz específica, que hará que la inicialización de la interfaz .
    • ** Por lo tanto, lo anterior dos casos por ejemplo, una, el segundo es el ejemplo, debido a que la conclusión misma corresponde a: una declaración constante en la interfaz, y esta constante puede ser completamente determinado especificar el valor en tiempo de compilación, entonces, son ellos esta interfaz no se cargará. ** Tres ejemplos son el caso en que el compilador no puede determinar los valores constantes.

    • Ejemplo uno:

      public class MyTest5 {
          public static void main(String[] args) {
              System.out.println(MyChild5.b);
          }
      }
      interface MyParent5{
          public static int a = 6;
      }
      interface MyChild5 extends MyParent5{
          public static int b = 5;
      }
      运行结果:
      

Aquí Insertar imagen Descripción

**结果分析:**

​		**可以看到,这里只有MyTest5被加载了,也就是MyParent5连加载都没有,更别说初始化了,得到的 5  是从常量池中获取的。**
  • Ejemplo 2:

    public class MyTest5 {
        public static void main(String[] args) {
            System.out.println(MyChild5.b);
        }
    }
    interface MyParent5{
        public static int a = 6;
    }
    class MyChild5 implements MyParent5{
        public static int b = 5;
    }
    
    • La interfaz MyChild5 cambió clase MyChild5, mirada a los resultados:
      Aquí Insertar imagen Descripción
      • Esta vez para ver, MyChild5, MyParent5 se cargan, y cuando se elimina MyParent5 archivo de clase no se cargará! ! [ Debido a que para la clase, dijo: int public static b = 5 no es una constante, no es modificación final, no va a ser cargado en la piscina constante, sin embargo, el int public static b = 5 estático en lugar pública final int b = 5, entonces la constante será colocado en la piscina constante, y por lo tanto no MyChilad5 de carga, también dijo que no se carga MyParent5. En la interfaz, definir constantes, el valor predeterminado es final, se carga directamente en la piscina constante ]
  • Tres ejemplos: [lee aquí puede ser un socio pequeño para discutir este caso más adelante]

    public class MyTest5 {
        public static void main(String[] args) {
            System.out.println(MyChild5.b);
        }
    }
    interface MyParent5{
        public static int a = 6;
    }
    interface MyChild5 extends MyParent5{
        public static final int b = new Random().nextInt(3);
    }
    
    • Esta operación dará lugar a resultados MyParnt5, Mychild5 se cargan:
      Aquí Insertar imagen Descripción
      Pero cuando me quita archivos de clase MyParnt5, el error! Descripción MyParnt5 necesita ser inicializado. [Primera Mychild5 se inicializará, porque b = new Random (). NextInt (3), el valor determinado en tiempo de ejecución. ]
      Aquí Insertar imagen Descripción
  • Tema "bloque"

    • Ejemplo uno:

      public class StaticLump {
          public static void main(String[] args) {
              new C();
              new C();
          }
      }
      class C{
          public C(){
              System.out.println("C");
          }
          {
              System.out.println("Hello");
          }
      }
      运行结果:
            Hello
            C
            Hello
            C
      
    • Ejemplo 2:

      public class StaticLump {
          public static void main(String[] args) {
              new C();
              new C();
          }
      }
      class C{
          public C(){
              System.out.println("C");
          }
          static {
              System.out.println("Hello");
          }
      }
      运行结果:
            Hello
            C
            C
      
    • resumen:

      • ① bloque de código en la clase no cambia la posición del resultado se lleva a cabo, "primero", si una modificación estática o no.
      • ②static modificado bloque estático de código se ejecuta una sola vez [constructor antes de realizar], no modificado se ejecuta antes de que se inicializa cada constructor de la clase.
  • Prueba: (1) Cuando se inicia una clase, y no se ha inicializado interfaces que implementa.

    public class MyTest5 {
        public static void main(String[] args) {
            System.out.println(MyChild5.b);
        }
    }
    interface MyParent5{
        public static Thread thread = new Thread(){
            {
                System.out.println("MyParent5 invoked");
            }
        };
    }
    class MyChild5 implements MyParent5{
        public static int b = 5;
    }
    

    El resultado: Descripción Primera MyParent5, MyChild5 se carga, MyChild5 es inicializado (porque int public static b = 5; variable no estática), si se ha inicializado MyParent5, a continuación, los códigos {...} se emitirá antes del constructor, no hay salida, y luego probar: al inicializar una clase, y no va a ser inicializado interfaces que implementa.
    Aquí Insertar imagen Descripción

  • Prueba: (2) durante la inicialización de una interfaz, y no se ha inicializado su interfaz padres.

    public class MyTest5 {
        public static void main(String[] args) {
            System.out.println(MyParent5_1.thread);
        }
    }
    interface MyGrandpa5_1{
        public static Thread thread = new Thread(){
            {
                System.out.println("MyParent5 invoked");
            }
        };
    }
    interface MyParent5_1 extends MyGrandpa5_1{
        public static Thread thread = new Thread(){
            {
                System.out.println("MyParent5 invoked");
            }
        };
    }
    

    Los resultados: Descripción Primera MyGrandpa5_1, MyParent5_1 se carga, MyParent5_1 sido inicializados (como está impreso: System.out.println ( "MyParent5_1 invoca") ;), si MyGrandpa5_1 sido inicializado, entonces los códigos correspondientes voluntad {...} es la salida, no hay salida antes de que el constructor, entonces la prueba: cuando una interfaz se inicializa y no inicializa su interfaz padres.
    Aquí Insertar imagen Descripción

Publicado 12 artículos originales · ganado elogios 0 · Vistas 221

Supongo que te gusta

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