Вы не можете использовать имя переменной в качестве типа другой переменной, что вы пытаетесь сделать с objOut.Inner
.Тип переменной - Inner
(или, необязательно, Outer.Inner
).
Поскольку Inner
является внутренним классом , он связан с экземпляр его внешнего класса (его включающий экземпляр ).Когда вы создаете его экземпляр, вы можете при желании указать, с каким экземпляром объекта он связан, что вы и делаете с objOut.new Inner
.
. Этот пример может помочь сделать его более понятным:
public class Example {
private String str;
public class Inner {
void show() {
// Show the string for the Example this Inner is part of
System.out.println(Example.this.str);
}
}
public Example(String s) {
this.str = s;
}
public static void main(String[] args) {
Example e1 = new Example("e1");
Example e2 = new Example("e2");
Inner i1 = e1.new Inner();
i1.show(); // "e1"
Inner i2 = e2.new Inner();
i2.show(); // "e2"
}
}
Live Copy
Обратите внимание, как экземпляр i1
Inner
получает e1
в качестве включающего его экземпляра Example
и, таким образом, видит e1
str
, но i2
получает e2
в качестве включающего его экземпляра, поэтому он видит e2
str
.
Я предлагаю этот учебник по Java для получения дополнительной информации.
¹ Иногда это не является обязательным, например, в моем классе Example
, указанном выше, так как там, где используется new Inner
, нет экземпляра по умолчанию, который он мог бы использовать.Это было бы необязательно в экземпляре метода Example
, но не в этом static
методе.