Типы ссылок: переменная не инициализирована, ошибка, путаница.JAVA

Программисты JAVA общаются здесь
Anonymous
Типы ссылок: переменная не инициализирована, ошибка, путаница.

Сообщение Anonymous »

Мой преподаватель дал нам этот вопрос для домашнего задания:
  • Выберите утверждение TRUE.
  • a) Этот код не скомпилируется. Возникнет ошибка:

    Возможно, локальная переменная c не была инициализирована
  • b) Этот код скомпилируется, но если вы попытаетесь его запустить при этом возникнет следующее исключение во время выполнения:

    NullPointerException
  • c) Этот код скомпилируется и запустится. Он отобразит ноль.

Код: Выделить всё

public class Runner{
public static void main( String [] args ){
int [] c;
met( c );
}

private static void met( int[] a ){
System.out.println( a.length );
}
}
Я сказал, что ответ — (Б), но правильный ответ — (А). Я в замешательстве, потому что когда я ссылаюсь на этот сайт: https://docs.oracle.com/javase/specs/jl ... jls-4.12.5, он утверждает, что ссылочные типы инициализируются нулевым значением.
Итак, вот мой вопрос: массивы являются ссылочными типами, верно? Если да, то почему целочисленный массив c выше не "указывает" на ноль, когда в приведенном ниже коде класс Sack имеет частную переменную экземпляра s, которой ДЕЙСТВИТЕЛЬНО присваивается значение null при вызове конструктора (что, как ни странно для меня, позволяет выполнить и распечатать строку 6 "" на консоль:
Изображение

Если я ошибаюсь насчет того, что массивы являются ссылочными типами, то:
  • Что на самом деле означает быть ссылочным типом?
  • Какой «тип» представляют собой массивы?
  • Что происходит в классе Runner, когда я объявляю int[] c? Разве c не должен «указывать» на null?
  • В обоих примерах рассматриваемый массив не является «локальной» переменной. Но один работает, а другой нет. Что делает s локальной переменной? не относится к c? Быть экземпляром класса?

Вернуться в «JAVA»