Чтобы понять, для чего нужен null в Java, приведем аналогию с числами: число 0 символизирует отсутствие чего-либо, а null означает то же самое для ссылочных типов данных. Если полю ссылочного типа (String, Object, StringBuilder) не присвоить никакого знания, по аналогии с примитивными типами оно получит значение по умолчанию, и этим значением будет null:
Код | Вывод на экран |
---|---|
|
0
null |
А если объявить массив таким способом:
String[] strings = new String[12];
создастся массив, содержащий 12 элементов, и все они будут равны null:
Код | Вывод на экран |
---|---|
|
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.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ