Подтвердить что ты не робот

Юридическая ссылка Java Legal

Является ли следующий код примером юридической пересылки? если да, то почему?

public class MyClass
{
  private static int x = getValue();
  private static int y = 5;
  private static int getValue()
  {
    return y;
  }
  public static void main(String[] args)
  {
    System.out.println(x);
  }
}
4b9b3361

Ответ 1

Вышеупомянутый код, который вы имеете, является совершенно законной Java. В Java статические поля инициализируются следующим образом: во-первых, все поля устанавливаются по умолчанию для их типа (0, false или null), а затем инициализируются в том порядке, в котором они объявлены. Это означает, что приведенный выше код гарантированно выполняет следующие действия:

  • Установите x и y в ноль, так как это значение по умолчанию для int s.
  • Инициализируйте x, вызвав getValue(), который считывает значение y. Поскольку y еще не инициализирован, он все еще имеет значение 0.
  • Инициализировать y до 5.

Это означает, что x примет значение 0 и y примет значение 5. Это поведение переносимо и гарантировано. Вы можете увидеть это здесь.

Надеюсь, это поможет!

Ответ 2

Вы можете определить, является ли это законным или нет тем, что он компилируется; в отличие от некоторых других языков, Java не имеет понятия "поведение undefined". То, что здесь происходит, полностью прописано. Это может быть противоречиво, но это специально законно: вы можете получить доступ к статической переменной до ее инициализации из метода, вызываемого при инициализации другой статической переменной. Поверхностно подобный случай доступа к y непосредственно из инициализатора x, то есть

private static int x = y;
private static int y = 5;

специально запрещен. У меня действительно нет веской причины - так оно и есть.