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

12

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

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);
  }
}

Ваш Ответ

2   ответа
19

ские поля инициализируются следующим образом: во-первых, все поля установлены по умолчанию для их типа (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. Это поведение переносимо и гарантировано.Вы можете увидеть это здесь.

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

Error: User Rate Limit Exceeded Vibhor
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededthisError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededindirectlyError: User Rate Limit ExceededdirectlyError: User Rate Limit Exceeded
5

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

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

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

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

Похожие вопросы