Не думайте, что статический класс является членом его охватывающего класса. Это свой собственный класс, совершенно отдельный. Единственное реальное различие между ним и классом верхнего уровня заключается в том, что оно имеет немного другое имя и может быть частным - что опять-таки не влияет на его семантику, кроме того, что только окружающий класс знает об этом.
Так что, если у меня есть:
public class EnclosingClass {
public static class InnerClass {
}
}
Тогда каждый может прийти вокруг и сделать:
EnclosingClass.InnerClass instance = new EnclosingClass.InnerClass();
См: точно так же, как класс верхнего уровня.
Это на самом деле относится и к внутреннему классу. Там несколько сложнее, но в основном идея состоит в том, что внутренний класс по-прежнему является его собственным классом, но он имеет (в основном скрытую) ссылку на экземпляр окружающего класса, который его создал. Я говорю «в основном», потому что можно получить доступ к этому экземпляру через EnclosingClass.this
. Компилятор java также делает некоторые удобные сантехника для вас, так что someFieldInTheEnclosingClass
становится EnclosingClass.this.someFieldInTheEnclosingClass
. Но не позволяйте этому стенографию вас обмануть: внутренний класс - это отдельный класс, а его экземпляр - это отдельный отдельный экземпляр; они не отличаются от класса высшего уровня в этом отношении.
имя статическое здесь вводит в заблуждение –
Статический класс ** не является ** членом. –