Да - s
есть null. Вы никогда не инициализируете его непустой ссылкой, поэтому, когда вы пытаетесь разыменовать его, вызывая s.print_func
, это вызывает исключение.
Это не имеет никакого отношения к переменной, являющейся статичной. Вы получите точно такое же исключение, если вы сделаете это:
public static void main(String args[])
{
sample s = null;
s.print_func();
}
EDIT: Для того, чтобы решить ваш комментарий более подробно, посмотрите на это:
class test
{
public final static sample s = null;
}
Объявляет класс, и в нем объявляет переменная. Это не объект. Важно различать три концепции:
- Переменная, которая является именованным местом хранения. Переменная имеет значение, и в этом случае это значение, которое является ссылкой
- Ссылка, которая всегда либо нулевой или способ добраться до объекта совместимого типа
- объектную
Так что, если у вас:
public static final sample s = new sample();
Тогда s
все равно будет переменная; его значение будет ссылкой на ненулевое значение, которое относится к объекту типа sample
.
Придумайте s
как, как кусок бумаги, который может быть либо пустым (а null
ссылка) или содержать уличный адрес дома. Сам адрес не является домом - это всего лишь способ получить к дому. Там может быть несколько листов бумаги с одним и тем же адресом, написанным на них. Копирование адреса на другой лист бумаги не создает нового дома.
Надеюсь, это поможет.
Ваш вопрос был бы намного лучше, если бы вы следовали соглашениям об именах Java для всех ваших имен и разумно отделили ваш код. –