Я не понимаю, где ваша путаница, но я постараюсь объяснить, почему она печатает 21. Пожалуйста, смотрите встроенные комментарии
Примечание: объекты названы для пояснения.
public class Outer {
private int innerCounter;</p>
<p>class Inner {
Inner() {
innerCounter++;
}</p>
<pre><code>public String toString() {
return String.valueOf(innerCounter);
}
}
private void multiply () {Inner inner = new Inner (); // Step2: Создать первый внутренний объект // Давайте назовем его innerA // Обратите внимание, что innerA созданusing outerA // Увеличивает переменную innerCount для outerA this.new Inner ();// step3 создаем второй внутренний объект // Давайте назовем его innerB // Обратите внимание, что innerB создан с использованием externalA // Увеличивает переменную innerCount для outerA
System.out.print(inner); //step 3 print innerCount from outerA
//With the two increments done, prints 2
inner = new Outer().new Inner(); //step4 create second outer object
//Lets call it outerB.
//Lets call this third inner object as InnerC
//InnerC creation increments OuterB's innerCount variable (so value 1)
//Assigned now to the old reference
System.out.println(inner); // prints the value of innerC
}
public static void main (String [] args) {new Outer (). Multiply ();// Step1: Создать первый внешний объект // Давайте назовем его OuterA
}}