Вопрос-ответ

What is null in Java?

Что такое null в Java?

Что такое null?

Является null экземпляром чего-либо?

К какому набору принадлежит null?

Как это представлено в памяти?

Переведено автоматически
Ответ 1

Является ли null экземпляром чего-либо?


Нет, не существует типа, который null является an instanceof.

15.20.2 Оператор сравнения типов instanceof


RelationalExpression:
RelationalExpression instanceof ReferenceType

Во время выполнения результатом instanceof оператора является true, если значение RelationalExpression не null и ссылка может быть приведена к ReferenceType без создания ClassCastException. В противном случае результат будет false.


Это означает, что для любого типа E и R, для любого E o, где o == null, o instanceof R всегда false.



К какому набору принадлежит 'null'?


JLS 4.1 Виды типов и значений


Существует также специальный тип 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) следует return false.


Это также значение по умолчанию (для переменных, у которых они есть) для всех ссылочных типов:

JLS 4.12.5 Начальные значения переменных



  • Каждая переменная класса, переменная экземпляра или компонент массива инициализируется значением по умолчанию при его создании:

    • Для всех ссылочных типов значением по умолчанию является null.



Способы его использования различны. Вы можете использовать это, чтобы включить так называемую отложенную инициализацию полей, когда поле будет иметь свое начальное значение null до тех пор, пока оно фактически не будет использовано, где оно заменяется "реальным" значением (вычисление которого может быть дорогостоящим).

Существуют и другие варианты использования. Давайте возьмем реальный пример из java.lang.System:


public static Console console()


ВОЗВРАТ: Системная консоль, если таковая имеется, в противном случае null.


Это очень распространенный шаблон использования: null используется для обозначения несуществования объекта.

Вот еще один пример использования, на этот раз из java.io.BufferedReader:


public String readLine() throws IOException


Возвращает: A String, содержащий содержимое строки, не включая никаких символов окончания строки, или null если достигнут конец потока.


Итак, здесь readLine() будет возвращаться instanceof String для каждой строки, пока, наконец, не вернет null для обозначения конца. Это позволяет обрабатывать каждую строку следующим образом:

String line;
while ((line = reader.readLine()) != null) {
process(line);
}

Можно спроектировать API так, чтобы условие завершения не зависело от readLine() возврата null, но можно видеть, что преимущество этого дизайна в том, что он делает вещи лаконичными. Обратите внимание, что с пустыми строками проблем нет, потому что пустая строка "" != null.

Давайте возьмем другой пример, на этот раз из java.util.Map<K,V>:


V get(Object key)


Возвращает значение, которому сопоставлен указанный ключ, или null если эта карта не содержит сопоставления для ключа.


Если эта карта допускает null значения, то возвращаемое значение null не обязательно указывает на то, что карта не содержит сопоставления для ключа; также возможно, что карта явно сопоставляет ключ с null. Для различения этих двух случаев можно использовать операцию containsKey.


Здесь мы начинаем понимать, как использование null может усложнить ситуацию. Первое утверждение гласит, что если ключ не сопоставлен, то null возвращается. Во втором операторе говорится, что даже если ключ сопоставлен, он null может также быть возвращен.

Напротив, java.util.Hashtable упрощает задачу, не разрешая null ключи и значения; его V get(Object key), если возвращает null, однозначно означает, что ключ не сопоставлен.

Вы можете ознакомиться с остальными API и найти, где и как null используется. Имейте в виду, что они не всегда являются примерами наилучшей практики.

Вообще говоря, null используются как специальное значение для обозначения:


  • Неинициализированное состояние

  • Условие завершения

  • Несуществующий объект

  • Неизвестное значение



Как это представлено в памяти?


В Java? Вас это не касается. И лучше оставить все как есть.


null Это хорошо?

Сейчас это на грани субъективного. Некоторые люди говорят, что это null вызывает множество ошибок программистов, которых можно было избежать. Некоторые говорят, что в языке, который улавливает, NullPointerException таком как Java, его полезно использовать, потому что вы быстро столкнетесь с ошибками программиста. Некоторые люди избегают этого, null используя Null object pattern и т.д.

Это огромная тема сама по себе, поэтому ее лучше всего обсудить в качестве ответа на другой вопрос.

Я закончу это цитатой из null самого изобретателя, К.А.Р. Хоара (известного как quicksort):


Я называю это своей ошибкой на миллиард долларов. Это было изобретение null ссылки в 1965 году. В то время я разрабатывал первую комплексную систему типов для ссылок на объектно-ориентированном языке (ALGOL W). Моей целью было гарантировать, что все использование ссылок должно быть абсолютно безопасным, с проверкой, выполняемой компилятором автоматически. Но я не смог удержаться от соблазна вставить null ссылку просто потому, что это было так легко реализовать. Это привело к бесчисленным ошибкам, уязвимостям и системным сбоям, которые, вероятно, причинили боль и ущерб на миллиард долларов за последние сорок лет.


Видео этой презентации более глубокое; рекомендуется посмотреть.

Ответ 2

Является ли null экземпляром чего-либо?


Нет. Вот почему null instanceof X вернет false для всех классов X. (Пусть вас не вводит в заблуждение тот факт, что вы можете присвоить null переменной, тип которой является типом объекта. Строго говоря, присвоение включает неявное преобразование типа; см. Ниже.)


К какому набору принадлежит 'null'?


Это единственный элемент типа null, где тип null определяется следующим образом:

"Существует также специальный тип null, тип выражения null, у которого нет имени. Поскольку тип null не имеет имени, невозможно объявить переменную типа null или привести к типу null. Ссылка null является единственно возможным значением выражения типа null. Ссылка null всегда может быть приведена к любому ссылочному типу. На практике программист может игнорировать тип null и просто притворяться, что null - это просто специальный литерал, который может иметь любой ссылочный тип." JLS 4.1


Что такое null?


Смотрите выше. В некоторых контекстах null используется для обозначения "нет объекта", "неизвестен" или "недоступен", но эти значения зависят от конкретного приложения.


Как это представлено в памяти?


Это зависит от конкретной реализации, и вы не сможете увидеть представление null в чистой Java-программе. (Но null представлено в виде нулевого машинного адреса / указателя в большинстве, если не во всех реализациях Java.)

Ответ 3

Что такое null?

Это ничто.

Является ли null экземпляром чего-либо?

Нет, поскольку это ничто, Оно не может быть экземпляром какой-либо вещи.

К какому набору принадлежит null?

Нет никакого набора

Как это представлено в памяти?

Если некоторые ссылки указывают на это, как:

Object o=new Object();

В памяти кучи некоторое пространство назначено новому созданному объекту. И o укажет на это назначенное пространство в памяти.

Теперь o=null;

Это означает, что теперь o не будет указывать на это пространство памяти объекта.

Ответ 4

Нет, это не экземпляр чего-либо, instanceof всегда будет false .

java