2014-01-09 4 views
0

Недавно я исследуйте, как виртуальная машина статической переменной нагрузки, но я встречаю проблему следующим образом:статической переменной процесса загрузки

public class Example{ 

    static{ 
     num = 3; 
     System.out.print(num); 
    } 
    public static int num; 
} 

Компилятор сообщает об ошибке. Я думаю, что num имеет область памяти и значение. Почему я не могу получить доступ к переменной num?

+4

Поместить 'public static int num;' над блоком (не может ссылаться на поле до его определения). Я не знаю, если это опечатка, но вы забыли написать 'int'. – Maroun

+0

- 1 для вашего кода не компилируется, но вы требуете ошибки во время выполнения и не указываете, какой из них. –

+0

Всегда копировать/вставлять ошибку и вывод исключений. –

ответ

6

static блоки и декларации выполнены в порядке их кодирования. Это означает, что во время выполнения статического блока поле num еще не определено.

Простое исправление перемещает декларацию выше блок.

Java Language Specification Section 8.3.2.3 (среди прочего) говорит, что переменная может присваивается значение перед тем объявляется, но значение переменной не может быть доступ перед переменная объявлена ​​, если его имя не полностью квалифицированный, так это составляет:

public class Example { 
    static{ 
     num = 3; // assignment OK without qualifying the name 
     System.out.print(Example.num); // name must be qualified to access value 
    } 
    public static int num; 
} 

еще более интересным является то, что если переменная доступна, прежде чем был объявлен Его по умолчанию значение используется, и далее инициализацию по декларации все еще происходит, так что этот код:

public class Example { 
    static{ 
     System.out.println(Example.num); // uses default value 
     num = 3;       // assignment OK 
     System.out.println(Example.num); // assigned value (3) is visible 
    } 

    public static int num = 1;   // initialization to 1 occurs 

    static{ 
     System.out.print(Example.num); // initialized value (1) is visible 
    } 
} 

Производит этот вывод:

0 
3 
1 

Wow!

+1

Я прочитал статью о том, как процесс загрузки виртуальной машины обрабатывается. Я думаю, что символическая ссылка num в файле класса была загружена в виртуальную машину, поэтому переменная num объявлена. Не понимаю ли я? – KrystalJake

+0

@ KrystalJake прочитал отредактированный ответ. интересно ... – Bohemian

+0

Прохладный, я понимаю ваше объяснение! Но не могли бы вы объяснить, почему я могу использовать полностью квалифицированную статическую переменную для доступа к ней? Большое спасибо. – KrystalJake

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