Статическая ссылка на нестатический внутренний класс
Вот отрывок кода
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 шт):
Вся проблема в том что любой созданный вами объект внутреннего не статического класса (B) должен создаваться с ссылкой на внешний объект класса (A). Поэтому, объекты класса B должны иметь возможность идентифицировать объект класса A который и привел к их созданию.
А как тогда тут у вас определить к какому объекту класса A должен быть связан объект класса B если вы его создаете как static поле, которое как мы знаем относится ко всему классу A в целом, соответственно в вашем случае получается что для всех объектов A соответствует единый объект B. Из-за этого по своей природе внутренний класс не может иметь такого поведения. Поэтому либо уберите static в месте объявления поля, либо сделайте B static классом и тогда он не будет нуждаться в связке с объектом класса A, ибо такой объект уже не имеет доступа к состоянию конкретного объекта класса A и существует как самостоятельный.
Если вы так в этом не уверенны то попробуйте создать объект внутреннего класса B в static методе класса A. Вам выдаст ту самую ошибку.
Если чего то не понятно задавайте вопросы, попытаюсь лучше объяснить и так пытался как можно короче. ( Извиняюсь за отсутствие форматирования, пишу ответ с телефона ).