Статическая ссылка на нестатический внутренний класс

Вот отрывок кода

public class A {
    static B b = new B(); //'A.this' cannot be referenced from a static context
    static C c = new C();

    public class B {
    }
}

class C {

}

Вопрос в следующем: Почему компилятор ругается на вторую строчку коду? Пытаюсь разобраться и понять в чём проблема, но ничего не лезет в голову. Объясните, кто может несчастному ламеру, пожалуйста. Знаю, что такое static. В принципе понимаю, почему внутренний класс так связан с внешним, если не ошибаюсь, то дело в неявном добавлении в конструктор внутреннего класса ссылки на объект внешнего класса. Поправьте, если что-то не то. В этой теме(с внутренними классами) я совсем глуп


Ответы (1 шт):

Автор решения: DevJ

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

А как тогда тут у вас определить к какому объекту класса A должен быть связан объект класса B если вы его создаете как static поле, которое как мы знаем относится ко всему классу A в целом, соответственно в вашем случае получается что для всех объектов A соответствует единый объект B. Из-за этого по своей природе внутренний класс не может иметь такого поведения. Поэтому либо уберите static в месте объявления поля, либо сделайте B static классом и тогда он не будет нуждаться в связке с объектом класса A, ибо такой объект уже не имеет доступа к состоянию конкретного объекта класса A и существует как самостоятельный.

Если вы так в этом не уверенны то попробуйте создать объект внутреннего класса B в static методе класса A. Вам выдаст ту самую ошибку.

Если чего то не понятно задавайте вопросы, попытаюсь лучше объяснить и так пытался как можно короче. ( Извиняюсь за отсутствие форматирования, пишу ответ с телефона ).

→ Ссылка