Этот классинстанцировании статические вложенные классы
public class Main {
public static void main(String[] args) {
Main m = new Main();
m.new A();
m.new B(); //1 - compilation error
new Main.B();
}
class A{}
static class B{} //2
}
приведет к компиляции ошибки времени в строке 1:
Illegal enclosing instance specification for type Main.B
Но я не могу понять, почему, я считаю, это немного противоречит здравому смыслу: в строке 2 у нас есть статическое определение класса, не должно ли быть доступно и из объекта m?
Редактировать
Если Main
была статическая переменная i
, m.i
не приведет к ошибке компиляции. Почему поведение отличается от определения класса?
Доступность не актуальна. Класс StringBuilder также доступен из объекта 'm'. Но вы не используете 'm.new StringBuilder()' для его создания. Синтаксис 'm.new' используется для создания экземпляра внутреннего класса Main, ссылающегося на объект-объект' m'. B не является внутренним классом и не имеет никакой неявной ссылки на любой Основной объект. –
@JBNizet Взгляните на мое редактирование, пожалуйста, –
Это не внутренний класс? Только нестатические классы определяются «внутренними», а статические - «вложенными»? –