Чтобы понять, для чего нужен 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.
undefined
12
Задача
Java Syntax Pro, 12 уровень, 4 лекция
Недоступна
Двигатель — сердце автомобиля
Двигатель — сложный механизм, для описания которого недостаточно обычной переменной. В классе Car создай внутренний класс (inner class) Engine. В классе Engine создай boolean поле isRunning, которое принимает значение true, если двигатель запущен, и false в противном случае. Также в этот класс добав
undefined
12
Задача
Java Syntax Pro, 12 уровень, 4 лекция
Недоступна
Утильный калькулятор
Давай проведем рефакторинг кода: вынесем отдельно утильные методы. Для этого создай внутренний статический (вложенный) класс Calculator и перенеси в него методы add, subtract, multiply и divide. Не забудь подкорректировать их вызовы.
undefined
12
Задача
Java Syntax Pro, 12 уровень, 4 лекция
Недоступна
Объекты внутренних и вложенных классов
В классе Outer есть внутренний (Inner) и вложенный (Nested) классы. В методе main класса Solution создай по одному объекту каждого из них.