12

Вопрос по java – Ссылка Java Legal Forward

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

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);
  }
}
  • Error: User Rate Limit ExceededindirectlyError: User Rate Limit ExceededdirectlyError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от Vibhor
  • Error: User Rate Limit Exceeded

    от Vibhor
  • Error: User Rate Limit Exceeded<clinit>() .

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit ExceededthisError: User Rate Limit Exceeded

    от
  • 19

    Приведенный выше код является совершенно законной Java. В Java статиче

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

    Set x and y to zero, since that's the default value for ints. Initialize x by calling getValue(), which reads the value of y. Since y hasn't yet been initialized, it still has the value 0. Initialize y to 5.

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

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

  • 5

    Вы можете сказать, законно ли это или нет, по факту его компиляции

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

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

    специально запрещено. Там действительно нет веских причин, почему - это так, как оно есть.