Что является пустым в Java?

Что null?

null экземпляр чего-нибудь?

То, что устанавливает, делает null принадлежать?

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

242
задан Joachim Sauer 5 May 2011 в 19:37
поделиться

7 ответов

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

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

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

 RelationalExpression: 
RelationalExpression instanceof ReferenceType 
 

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

Это означает, что для любого типа 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) должно вернуть false .

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

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

  • Каждая переменная класса, переменная экземпляра или массив Компонент инициализируется значением по умолчанию при его создании:
    • Для всех ссылочных типов значение по умолчанию 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 просто потому, что это было так легко реализовать. Это привело к бесчисленным ошибкам, уязвимостям и системным сбоям, которые, вероятно, причинили боль и ущерб на миллиард долларов за последние сорок лет.

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

302
ответ дан 23 November 2019 в 03:14
поделиться

null - это особое значение, это не экземпляр чего-либо. По очевидной причине это не может быть экземпляром чего-либо.

4
ответ дан 23 November 2019 в 03:14
поделиться

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);
6
ответ дан 23 November 2019 в 03:14
поделиться

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

9
ответ дан 23 November 2019 в 03:14
поделиться

Ключевое слово null - это литерал, представляющий пустую ссылку , которая не ссылается ни на какой объект . null - это значение по умолчанию для переменных ссылочного типа.

Также можно посмотреть

null: Java Glossary

7
ответ дан 23 November 2019 в 03:14
поделиться

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);
   }
}
3
ответ дан 23 November 2019 в 03:14
поделиться

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

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

What set принадлежит ли 'null'?

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

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

Что такое null?

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

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

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

30
ответ дан 23 November 2019 в 03:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: