Usando un nombre de clase interno y un nombre de objeto igual en Java

En el siguiente fragmento de código, presumiblemente parece que debería emitir algún error de compilación pero no lo hace:

class Outer {
    public static class Inner {
        static String obj = "Inner";
    }

    static Optional Inner = new Optional();
    //The (inner) class name and the object name are same.
}

class Optional {
    String obj = "Optional";
}

public class Main {

    public static void main(String[] args) {
        System.out.println(Outer.Inner.obj);
        //Refers to the string inside the optional class
    }
}

La claseOuter tiene una clase estática dentro de ella llamadaInner. Adicionalmente, declara un objeto (estático) de la clase.Optional (static Optional Inner = new Optional();)

Este objeto y los nombres de clase (dentro de la claseOuter) son lo mismo que esInner. El programa muestraOptional. La unica expresionOuter.Inner.obj dentromain() se espera que muestreInner pero no lo hace La salida real es sin embargoOptional cual es el caso de laOptional clase.

Una forma de mostrarInner Es cambiando el nombre del objeto a otra cosa.

static Optional Inner1 = new Optional();

Desde la salida que muestra, parece que el nombre del objeto (o una variable) se elige sobre un nombre de tipo (la claseInner) porque tienen el mismo nombre. ¿Qué caso exacto se aplica aquí?

Respuestas a la pregunta(3)

Su respuesta a la pregunta