это ошибка компилятора Java? - PullRequest
2 голосов
/ 03 июня 2019

Компилятор выдает ошибку компиляции, которая не имеет смысла. «Невозможно сделать статическую ссылку на нестатическое поле x» Я не делаю статическую ссылку. Статический внутренний класс должен иметь доступ к закрытым членам окружающего класса. На самом деле это позволяет мне получить доступ к super.x

Я пробовал это с Java 1.8

class Bug
{
   private int x = 0;
   int y;

   static class BugDerived extends Bug
   {
      BugDerived()
      {
         super();

         super.y = 1; // no error
         y = 1;       // no error
         super.x = 1; // no error !
         x = 1;  // ERROR
      }
   }
}

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Нет, статический метод может ссылаться только на статические поля или другие методы. Вызывая super (). X, вы ссылаетесь на нестатическое свойство из нестатического контекста, что разрешено.

Следующая цитата взята с сайта Oracle .

Нестатические вложенные классы (внутренние классы) имеют доступ к другим членам включающего класса, даже если они объявлены закрытыми. Статические вложенные классы не имеют доступа к другим членам включающего класса.

Внутренний статический класс не имеет доступ к членам (частным методам / переменным) включающего класса.

Также смотрите здесь :

статический вложенный класс не может напрямую ссылаться на переменные экземпляра или методы, определенные в своем классе: он может использовать их только через ссылка на объект. Доступ к ним осуществляется с помощью имени класса вмещающего.

0 голосов
/ 03 июня 2019

Статический внутренний класс связан с внешним классом на уровне класса, а не на уровне экземпляра.

В результате он может получить доступ только к статическим членам внешнего класса, работая в этом отношении идентично статическим методам.

Следовательно, это не ошибка компилятора, это ожидаемое поведение.

Когда вы используете super.x, вы получаете доступ к элементу данных x из экземпляра суперкласса, который лежит в основе экземпляра вложенного класса, для которого выполняется конструктор, поэтому он имеет доступ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...