Класс может быть создан в статическом контексте, не будучи объявлен статическим, и это то, что происходит Вот. Давайте посмотрим на то, что было объявлено статической, и создаются в статическом контексте означает:
Разница между анонимным классом, созданным в статическом контексте и нестатическая контексте имеет ли оно охватывающую экземпляр:
Если с анонимным класс, то:
Если выражение создания экземпляра класса происходит в статическом контексте, то я не не сразу ограждающим экземпляр.
В противном случае непосредственным экземпляром i является это.
Вложенный класс, который объявлен статический позволяет статические члены:
Внутренний класс вложенный класс, который не является явно или неявно объявляется статической.
Вложенный класс, который не является внутренним классом, может объявлять статические члены свободно, в соответствии с обычными правилами программирования Java .
Говоря вложенный класс, который «неявно объявлен статическим», это относится к вещам, как классы в интерфейсах:
класс член интерфейса неявно статический (§9.5), так что никогда не считается внутренним классом.
Анонимные классы не объявляются статическими (ни явным образом с ключевым словом, ни имплицитно, например, внутри интерфейса), и поэтому не допускают объявления статических членов. Однако они могут быть созданы в статическом контексте, что означает, что они не относятся к охватывающему экземпляру.
Поскольку анонимные классы не объявлены статическими, обе кавычки в вопросе согласованы.
'B b = new B() {};' не является анонимным классом.И он работает, потому что он * используется в * статическом контексте, он объявляет внутренний класс статическим, что запрещено. –
@Shywim Итак, какой тип был объектом, созданным 'new B() {}'? –