Чтобы понять, для чего нужен null в Java, приведем аналогию с числами: число 0 символизирует отсутствие чего-либо, а null означает то же самое для ссылочных типов данных. Если полю ссылочного типа (String, Object, StringBuilder) не присвоить никакого знания, по аналогии с примитивными типами оно получит значение по умолчанию, и этим значением будет null:

Код Вывод на экран
public class Solution {

    public static int i;
    public static String s;

    public static void main(String[] args) {
        System.out.println(i);
        System.out.println(s);
    }
}
0
null

А если объявить массив таким способом:

String[] strings = new String[12];

создастся массив, содержащий 12 элементов, и все они будут равны null:

Код Вывод на экран
public class Solution {
    public static void main(String[] args) {
        String[] strings = new String[12];

        for (int i = 0; i < strings.length; i++) {
            System.out.println(i + "-й элемент: " + strings[i]);
        }
    }
}
0-й элемент: null
1-й элемент: null
2-й элемент: null
3-й элемент: null
4-й элемент: null
5-й элемент: null
6-й элемент: null
7-й элемент: null
8-й элемент: null
9-й элемент: null
10-й элемент: null
11-й элемент: null

Как видишь, при конкатенации со строкой null превращается в строку “null”. Хотя, если вызвать у него метод toString():

String[] strings = null;
System.out.println(strings.toString());

получишь NullPointerException (исключения мы позже разберем подробно). То же самое произойдет, если попытаться вызвать у null любой другой метод (исключение – статические методы, с которыми ты скоро познакомишься):

public static void main(String[] args) {
    StringBuilder sb = null;
    sb.append("test"); // скомпилируется, но при выполнении будет ошибка
}

null, помимо прочего, — зарезервированное ключевое слово (как public или static), так что не получится создать переменную, метод, или класс с именем null. Это ключевое слово, как и другие, регистрозависимое (ты мог обратить внимание, что мы везде пишем null с маленькой буквы), поэтому:

String firstName = Null; // будет ошибка компиляции
String secondName = NULL; // будет ошибка компиляции
String fullName = null; // скомпилируется

Рассмотрим, что еще можно и нельзя делать с null:

  • Любой ссылке можно присвоить null:

    StringBuilder sb = null;
  • null можно привести к любому ссылочному типу:

    String s = (String) null; // скомпилируется, хотя смысла не прибавит :)
  • null нельзя присвоить примитивной переменной:

    int i = null; // не скомпилируется
  • null можно сравнивать с помощью == и !=

  • null == null возвращает true

В предыдущих лекциях мы рассказывали, что в Java все является объектом, и у каждого объекта есть тип.

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

Что важно запомнить:

  • null – это значение по умолчанию для ссылочных типов данных;
  • null – это "отсутствие значения";
  • если у объекта, значение которого равно null, вызвать какой-либо метод – компиляция такого кода пройдет, а во время выполнения получим исключение NullPointerException.