Saltos de bloque de inicialización estática

El bloque de inicialización estática en la clase Outno pública no se ejecuta, pero se ejecuta el bloque de inicialización estática en la clase anidada estática snOut. ¿Cómo y por qué es esto posible?

public class staticNested {

    static{
        System.out.println("In staticNested");
    }

    static class sn{

        static{
            System.out.println("sn in staticNested");
        }

        void p(){
            System.out.println("In static nested class method p");
        }
    }

    public static void main(String [] args){
        sn n = new sn();
        n.p();

        Out.snOut no = new Out.snOut();
        no.p();
    }
}

 class Out{

     static{
         System.out.println("In Out"); //Skips this
         System.out.println("Here");  //Skips this
     }

     static class snOut{

         static {
             System.out.println("In snOut in Out");
         }

            private int x;

            void p(){
                System.out.println("In snOut in outside Class out: " + x);
            }

        }
    }

Esta es la salida:

In staticNested
sn in staticNested
In static nested class method p
In snOut in Out
In snOut in outside Class out: 0
Respuesta 1

Según JLS 8.1.3

Una instancia de una clase interna I cuya declaración se produce en un contexto estático no tiene instancias de cierre léxico .

En su código está intentando acceder a la clase sn que es estática, por lo que no tendrá ninguna clase adjunta según la especificación. Es por eso que el bloque estático de las clases que encierran no se están ejecutando.

Respuesta: 2

Tus clases internas son estáticas. Esto significa que son como las clases externas, y un objeto de su tipo puede inicializarse sin la necesidad de un objeto padre. Así que aquí los objetos principales nunca se inicializan y sus bloques de inicialización estática no se ejecutan.

Respuesta: 3

¿Por qué la interfaz de la Colección tiene iguales (Object o) y hashCode (), dado que cualquier implementación tendrá esos por defecto (heredado de Object)?

¿Hay alguna manera de eliminar una carpeta del classpath similar a agregar una carpeta en tiempo de ejecución (¿Se puede agregar un directorio a la ruta de clase en tiempo de ejecución?)

Estamos migrando nuestra aplicación web de Java 7 a Java 8. Habíamos definido los argumentos param jvm de PermSize. Como Java 8 ignorará estos parámetros, esto no es de utilidad. Se introduce Metaspace ...

Me he referido a esto antes de publicar esta pregunta. Verificación de envoltorios nulos contra valores primitivos Y tengo una situación en la que quiero verificar el Wrapper Integer con nulo también 0 if (statusId! = Null ...