В следующем фрагменте кода, по-видимому, кажется, что он должен выпустить некоторую ошибку компиляции, но это не так:
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
), поскольку они имеют одинаковое имя. Какой именно случай применяется здесь?