Что такое нелегальная ссылка на себя в Java? - PullRequest
1 голос
/ 12 октября 2019

Когда я пытаюсь скомпилировать следующий класс

class C1 {
  Integer v1 = v1;
}

, я получаю Illegal Self Reference ошибку. Теперь рассмотрим другой класс, как показано ниже.

class C2 {
  Integer v1;
  {
    v1 = v1;
  }
}

И он компилируется. В чем разница между обоими классами и почему один компилируется, а другой нет.

ОБНОВЛЕНИЕ:

Если v1 не стало доступно в классе C1, то почемуследующая работа в классе тоже?

class C3 {
  Integer v1 = v1 = 1;
}

В приведенном выше C3 класс v1 доступен для выражения v1 = 1, которое нужно оценить, но оно не работает в C1. Вы можете объяснить?

1 Ответ

0 голосов
/ 12 октября 2019

v1 начинает существовать после того, как вы его определили, поэтому, когда вы пытаетесь сохранить значение в себе, оно еще не существует:

class C1 {
    Integer v1 = v1;
//declaring-^     ^-doesn't exist yet
}

Это эквивалентный код:

public class SomeClass {
    Integer v1;

// объявление .... ^

    public SomeClass() {
        this.v1 = v1;
//           ^-----^
//              |
//          both exist
    }
}

В вашем примере код экземпляра блока выполняется после объявления переменной, как конструктор:

class C2 {
  Integer v1;
  {
    v1 = v1;  // instance block executed after variable declaration
  }
}

последняя часть обновленного вопроса очень хорошо объяснена здесь https://softwareengineering.stackexchange.com/questions/205079/what-is-the-difference-advantage-of-doing-double-assignment

и ответ в комментарии пользователя @ user207421 (о правильной ассоциации)

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