Юридическая ссылка 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);
}
}
Ответы
Ответ 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;
специально запрещен. У меня действительно нет веской причины - так оно и есть.