2015-04-09 2 views
0

Поскольку статическая переменная получила память во время загрузки класса, здесь я назначаю ее, создавая новую A(), которая будет назначаться во время выполнения после загрузки класса. Как jvm присваивает значение нового A() во время загрузки класса?Как статическая переменная получает значение объекта во время загрузки класса?

public class A{ 
static A objA =new A(); 
public static void main(String x[]){} 
} 
+0

Я предлагаю вам прочитать 'Inside jvm by bill venners' – Prashant

ответ

2

Когда класс загружен, JVM вызывает метод в классе <clinit>()V. Этот метод устанавливает все начальные значения и в вашем случае устанавливает статическое поле.

Он может создавать экземпляры во время вызова метода, но это означает, что вы не можете предположить в конструкторе, что все статические поля были установлены, если вы это сделаете.

+1

Пример показывает такое поведение http://ideone.com/N3lyW7 (когда класс загружается, его поля сначала устанавливаются в значения по умолчанию, а затем инициализируются сверху вниз). – Pshemo

2

Здесь нет ничего странного. Класс загружен, тогда new A() создан и назначен для objA. Как это происходит на самом деле внутри, на самом деле не актуально и может варьироваться между JVM.

+0

Поскольку статическая переменная разделяет общую область памяти между несколькими объектами того же класса, статическая переменная получает память один раз для нескольких объектов. еще один объект-объект создается позже не во время загрузки класса, как jvm может назначить его во время загрузки класса? –

+0

@ArpitDubey - не * класс loading *. Класс уже * загружен *. * статическим * полям присваиваются значения/инициализируются во время инициализации * класса *. Таким образом, определение класса * уже существует в области JVM/method. – TheLostMind

+0

@TheLostMind спасибо человеку. Ваша средняя статическая переменная получила память во время загрузки класса, но они инициализировались во время инициализации, тогда jvm выбрал код из области метода. –

Смежные вопросы