2013-09-01 4 views
2

У меня есть следующий код:Статические переменные процесса инициализации

public class StaticKindOfThing { 
    static int a =getValue(); 
    static int b = 10; 
    public static int getValue() 
    { 
     return b; 
    } 

    public static void main (String []args) 
    { 
     System.out.println(a); 
    } 
} 

Я знаю, что переменные по умолчанию установлено значение 0, однако это не произошло во время выполнения? Из вышеприведенного кода кажется, что инициализация по умолчанию до 0 выполняется до времени выполнения. В противном случае getValue должен давать ошибку компиляции или исключение времени выполнения, не находя значение. Так что мой вопрос. Переменная static int b = 10; получает значение 0 по умолчанию во время компиляции?

ответ

2

Он получает значение, которое вы предоставляете т.е. 10. Статические переменные загружаются во время выполнения

Когда ты запускать JVM и загружать класс StaticKindOfThing, затем статические блоки или поля (здесь a, b) загружаются в JVM и становятся доступными.

От here: -

  • Это переменная, которая принадлежит к классу, а не объект (экземпляр)
  • Статические переменные инициализируются только один раз, в начале выполнения.
  • Эти переменные будут инициализированы первым, до инициализации любых переменных экземпляра
  • Один экземпляр для совместного использования всеми экземплярами класса
  • Статическая переменная может получить доступ непосредственно к имени класса и не нужен какой-либо объект

EDIT: -

Перейди через Detailed Initialization Procedure

+0

вывод 0 фактически не 10 – Rollerball

+0

Это потому, что вы не поставили значение a в статическом блоке. попробуйте поставить это в статический блок и увидеть результат. !! –

+0

Попробуйте следующее: - static int a; static { a = getValue(); } –

1

Нет, он получает значение, при условии, ака 10.

В вашем случае даже вы пишете:

static int a; 

результат будет 0. Потому что вы не дали никакой ценности.

Иногда вы можете написать static блок, как:

static { 
    //... 
} 

, чтобы быть уверенным, что этот блок работает первый перед классом инициации.

Статический блок инициализатора выполняется только один раз, когда класс загружается в JVM, как статическая переменная.

Попробуйте это тот, который будет делать то, что вы думаете:

public class StaticKindOfThing { 

static int a; 
static int b = 10; 

static{ 
    a = getValue(); 
} 


public static int getValue() 
{ 
    return b; 
} 

public static void main (String []args) 
{ 
    System.out.println(a); 
} 
} 

Выход: 10

+0

Результат 0 – Rollerball

+0

См. Мое сообщение edit :). put 'getValue()' в 'static' block –

+0

Я хотел бы знать точный момент, когда переменная b получает значение 0. Она получает значение 0, поскольку результат моего кода равен 0 – Rollerball

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