В следующем фрагменте кода, по-видимому, кажется, что он должен выпустить некоторую ошибку компиляции, но это не так:
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
}
}
Класс Outer имеет внутри себя статический класс с именем Inner. Кроме того, он объявляет объект (статический) класса Optional (static Optional Inner = new Optional();)
Этот объект и имена классов (внутри класса Outer) являются такими же, как Inner. В программе отображается Optional. Ожидается, что в выражении Outer.Inner.obj в пределах main() будет отображаться Inner, но это не так. Однако фактический вывод Optional относится к классу Optional.
Одним из способов отображения Inner является изменение имени объекта на что-то еще.
static Optional Inner1 = new Optional();
Из выводимого на экран вывода, кажется, что имя объекта (или переменная) выбрано над именем типа (класс Inner), поскольку они имеют одинаковое имя. Какой именно случай применяется здесь?