Что null
?
null
экземпляр чего-нибудь?
То, что устанавливает, делает null
принадлежать?
Как это представлено в памяти?
Является ли null экземпляром чего-либо?
Нет, не существует типа, который null
является instanceof
.
instanceof
RelationalExpression: RelationalExpression instanceof ReferenceType
Во время выполнения результат выполнения оператора
instanceof
равноистина
, если значение RelationalExpression не равноnull
и ссылка может быть приведена к ReferenceType без повышенияClassCastException
. В противном случае результат будетложным
.
Это означает, что для любого типа E
и R
, для любого E o
, где o == null
, o instanceof R
всегда false
.
К какому набору принадлежит 'null'?
Существует также специальный null тип, тип выражения
null
, у которого нет названия. Поскольку тип null не имеет имени, невозможно объявить переменную типа null или привести к типу null .Ссылкаnull
- единственное возможное значение выражения типа null . Ссылкаnull
всегда может быть приведена к любому ссылочному типу. На практике программист может игнорировать тип null и просто притвориться, чтоnull
- это просто специальный литерал, который может быть любого ссылочного типа.
Что такое null?
Как сказано в приведенной выше цитате JLS, на практике вы можете просто притвориться, что это «просто специальный литерал, который может быть любого ссылочного типа».
В Java null == null
(это не всегда так в других языках). Также обратите внимание, что по контракту он также имеет это специальное свойство (из java.lang.Object
):
public boolean equals (Object obj)
Для любого не
null
ссылочное значениеx
,x.equals (null)
должновернуть false
.
Это также значение по умолчанию (для переменных, которые имеют их) для всех ссылочных типов:
- Каждая переменная класса, переменная экземпляра или массив Компонент инициализируется значением по умолчанию при его создании:
- Для всех ссылочных типов значение по умолчанию
null
.
Как это используется, варьируется. Вы можете использовать его, чтобы включить так называемую ленивую инициализацию полей, при которой поле будет иметь начальное значение null
до тех пор, пока оно не будет фактически использовано, где оно будет заменено «реальным» значением. (что может быть дорогостоящим для вычисления).
Есть и другие варианты использования.Возьмем реальный пример из java.lang.System
:
общедоступная статическая консоль console ()
Возвращает : системная консоль, если есть, в противном случае
null
.
Это очень распространенный шаблон использования: null
используется для обозначения отсутствия объекта.
Вот еще один пример использования, на этот раз из java.io.BufferedReader
:
public String readLine () выдает исключение IOException
Возвращает : A
String
, содержащий содержимое строки, не включая символы завершения строки, илиnull
, если достигнут конец потока.
Итак, здесь readLine ()
будет возвращать instanceof String
для каждой строки, пока, наконец, не вернет null
для обозначения конца. Это позволяет обрабатывать каждую строку следующим образом:
String line;
while ((line = reader.readLine()) != null) {
process(line);
}
API можно разработать так, чтобы условие завершения не зависело от readLine ()
, возвращающего null
, но можно видеть что у этого дизайна есть преимущество, заключающееся в лаконичности. Обратите внимание, что с пустыми строками проблем нет, потому что пустая строка ""! = Null
.
Возьмем другой пример, на этот раз из java.util.Map
:
V get (Object key)
Возвращает значение, которому сопоставлен указанный ключ. или
null
, если эта карта не содержит сопоставления для ключа.Если эта карта допускает
нулевые
значения, то возвращаемое значениеnull
не обязательно означает, что карта не содержит отображения для ключа; также возможно, что карта явно отображает ключ вnull
. ОперацияcontainsKey
может использоваться для различения этих двух случаев.
Здесь мы начинаем видеть, как использование null
может усложнять ситуацию. Первый оператор говорит, что если ключ не отображается, Возвращено значение null
. Во втором утверждении говорится, что даже если ключ отображается, null
может быть возвращено также .
Напротив, java.util.Hashtable
упрощает работу, не разрешая нулевые
ключи и значения; его V get (Object key)
, если возвращает null
, однозначно означает, что ключ не отображается.
Вы можете прочитать остальные API и узнать, где и как используется null
. Имейте в виду, что они не всегда являются лучшими примерами.
Вообще говоря, null
используется как специальное значение для обозначения:
Как это он представлен в памяти?
В Java? Никакой вашей заботы. И лучше так держать.
null
- это хорошо? Теперь это граничит с субъективным. Некоторые говорят, что null
вызывает множество ошибок программиста, которых можно было бы избежать. Некоторые говорят, что на языке, который улавливает NullPointerException
, таком как Java, его полезно использовать, потому что вы быстро откажетесь от ошибок программиста. Некоторые люди избегают null
, используя шаблон объекта Null и т. Д.
Это огромная тема сама по себе, поэтому ее лучше обсудить как ответ на другой вопрос.
Я закончу это цитатой самого изобретателя null
, C.A.R Hoare (славы быстрой сортировки):
Я называю это своей ошибкой на миллиард долларов. Это было изобретение
нулевой
ссылки в 1965 году. В то время я проектировал первую всеобъемлющую систему типов для ссылок на объектно-ориентированном языке (ALGOL W). Моя цель состояла в том, чтобы гарантировать, что любое использование ссылок должно быть абсолютно безопасным, с автоматической проверкой компилятором. Но я не мог устоять перед соблазном поместить ссылкуnull
просто потому, что это было так легко реализовать. Это привело к бесчисленным ошибкам, уязвимостям и системным сбоям, которые, вероятно, причинили боль и ущерб на миллиард долларов за последние сорок лет.
Видео этой презентации идет глубже; это рекомендуемые часы.
null
- это особое значение, это не экземпляр чего-либо. По очевидной причине это не может быть экземпляром
чего-либо.
Null не является экземпляром какого-либо класса.
Однако вы можете присвоить значение null переменным любого типа (объекта или массива):
// this is false
boolean nope = (null instanceof String);
// but you can still use it as a String
String x = null;
"abc".startsWith(null);
Нет, это не экземпляр чего-либо, instanceof всегда будет ложным.
Ключевое слово null - это литерал, представляющий пустую ссылку , которая не ссылается ни на какой объект . null - это значение по умолчанию для переменных ссылочного типа.
Также можно посмотреть
null
- это особое значение, не являющееся экземпляром какого-либо класса. Это иллюстрируется следующей программой:
public class X {
void f(Object o)
{
System.out.println(o instanceof String); // Output is "false"
}
public static void main(String[] args) {
new X().f(null);
}
}
Является ли null экземпляром чего-либо?
Нет. Вот почему null instanceof X
вернет false
для всех классов X
. (Пусть вас не вводит в заблуждение тот факт, что вы можете присвоить null
переменной, тип которой является типом объекта. Строго говоря, присвоение включает неявное преобразование типа; см. Ниже.)
What set принадлежит ли 'null'?
Это единственный член нулевого типа, где нулевой тип определяется следующим образом:
«Существует также специальный нулевой тип, тип выражения null, который не имеет имени.Поскольку у нулевого типа нет имени, невозможно объявить переменную нулевого типа или привести к нулевому типу. Пустая ссылка - единственное возможное значение выражения нулевого типа. Нулевая ссылка всегда можно привести к любому ссылочному типу. На практике программист может игнорировать нулевой тип и просто притвориться, что null - это просто специальный литерал, который может иметь любой ссылочный тип. " JLS 4.1
Что такое null?
См. Выше. В некоторых контекстах null
используется для обозначения «нет объекта», «неизвестно» или «недоступен», но эти значения зависят от приложения.
Как это представлено в памяти?
Это зависит от реализации, и вы не сможете увидеть представление null
в чистой программе Java. (Но null
представлен как нулевой машинный адрес / указатель в большинстве, если не во всех реализациях Java.)