Usando um nome de classe interna e um nome de objeto mesmo em Java

No trecho de código a seguir, presumivelmente parece que ele deve emitir algum erro de compilação, mas não:

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
    }
}

A classeOuter tem uma classe estática dentro dele chamadoInner. Além disso, ele declara um objeto (estático) da classeOptional (static Optional Inner = new Optional();)

Este objeto e os nomes das classes (dentro da classeOuter) são os mesmos que sãoInner. O programa exibeOptional. A única expressãoOuter.Inner.obj dentromain() é esperado para exibirInner mas isso não acontece. A saída real é no entantoOptional qual é o caso doOptional classe.

Uma maneira de exibirInner é mudando o nome do objeto para outra coisa.

static Optional Inner1 = new Optional();

Na saída exibida, parece que o nome do objeto (ou uma variável) é escolhido sobre um nome de tipo (a classeInner) porque eles têm o mesmo nome. Qual caso exato é aplicado aqui?

questionAnswers(3)

yourAnswerToTheQuestion