static
здесь диктует, как Inner
и InnerNoStatic
используются по отношению к Outer
.
Поскольку Inner
является c в Outer
, оно не привязано к любой конкретный c экземпляр Outer
(как всегда, член stati c принадлежит классу, а не какому-либо конкретному экземпляру этого класса). Это объясняет, как это компилируется:
Outer.Inner inner1 = new Outer.Inner();
InnerNoStatic
, однако, является членом экземпляра (вот что: если он не stati c, он привязан к данному члену). И это объясняет, почему компилятор вызывает ошибку здесь:
Outer.InnerNoStatic inner3 = new Outer.InnerNoStatic();
Поскольку InnerNoStatic
должен быть привязан к экземпляру Outer
, вам нужно использовать такой экземпляр для создания inner3
:
Outer.InnerNoStatic inner3 = new Outer().new InnerNoStatic(); //note the calls
Вы также можете использовать существующий экземпляр.
Outer outer = new Outer();
Outer.InnerNoStatic inner3 = outer.new InnerNoStatic();
В обоих этих случаях экземпляр Outer
используется для создания экземпляра InnerNoStatic
(просто нет переменной, указывающей к объекту Outer
, созданному с помощью new Outer().new InnerNoStatic()
)
Примечание: new Outer.Inner();
легко спутать с new Outer().new Inner();
. Это не одно и то же (в первом случае «Outer» в основном играет роль пространства имен, тогда как во втором new Outer()
создает объект Outer
). То есть один вызов конструктора (Inner()
) в первом, но два вызова конструктора во втором (Outer()
и Inner()
).