2015-12-20 6 views
2

Этот классинстанцировании статические вложенные классы

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 не приведет к ошибке компиляции. Почему поведение отличается от определения класса?

+0

Доступность не актуальна. Класс StringBuilder также доступен из объекта 'm'. Но вы не используете 'm.new StringBuilder()' для его создания. Синтаксис 'm.new' используется для создания экземпляра внутреннего класса Main, ссылающегося на объект-объект' m'. B не является внутренним классом и не имеет никакой неявной ссылки на любой Основной объект. –

+0

@JBNizet Взгляните на мое редактирование, пожалуйста, –

+0

Это не внутренний класс? Только нестатические классы определяются «внутренними», а статические - «вложенными»? –

ответ

2

Номер

Весь смысл статического внутреннего класса является то, что он не есть экземпляр класса вмещающей.

+0

Я понимаю это. Это похоже на любой другой статический член. Но если 'Main' имел статическую переменную' i', 'm.i' не приводило бы к ошибке компиляции –

+1

@LuigiCortese: эта функция была ошибкой. Разработчики языка не понесли эту ошибку новым функциям языка. – SLaks

+0

Серьезно ?? Любая ссылка? –

1

m.new B(); - неправильный способ создания вложенного статического класса, поскольку B не является переменной экземпляра класса Main - поэтому для его создания не требуется экземпляр Main. Скорее всего вы можете сделать

new Main.B(); 

Цитируя docs для ясности

Статический вложенный класс взаимодействует с членами экземпляра своего внешнего класса (и других классов) так же, как и любой другой класс верхнего уровня. По сути, статический вложенный класс поведенчески является классом верхнего уровня, который был вложен в другой класс верхнего уровня для удобства упаковки.

+0

Прочтите мое редактирование, пожалуйста –

+0

Только для нестатических вложенных классов необходим внешний класс для его создания. Поэтому, говоря «m.new B();' неверно, поскольку 'm' не владеет' B', это похоже на любой другой класс верхнего уровня. Итак, что вы имеете в виду, почему я не могу получить доступ к классу как 'm.B', как любая другая статическая переменная.Я не могу быть правильным человеком, чтобы ответить на этот вопрос: так оно и было. –

Смежные вопросы