JavaRush /Java блог /Java Developer /Является ли null в Java объектом?

Является ли null в Java объектом?

Статья из группы Java Developer
Является ли null объектом? Я могу совершенно точно сказать, что не является. В том смысле, что (null instanceof Object) выдаст значение false. Вот что ещё нужно знать о null:
Является ли null в Java объектом? - 1
  1. Вы не можете вызвать метод со значением null: x.m() выдаст ошибку, когда x является null, а m — нестатический метод. Кстати, если m — статический метод, товсё хорошо, поскольку важен только класс x, а значение игнорируется.

  2. Есть только один null на всех, а не отдельный для каждого класса. Таким образом, ((String) null == (Hashtable) null), например.

  3. Вполне допустимо передавать null в качестве параметра методу, если метод это допускает (некоторые методы допускают null-параметр, другие — нет). Так, например, вы вполне можете написать System.out.println (null), а вот butstring.compareTo (null) не получится. Так что всегда указывайте в javadoc-комментариях ваших методов, допустим ли null в качестве их параметров, если это не вполне очевидно.

  4. В JDK начиная с версии 1.1 и вплоть до 1.1.5 передача null в качестве литерального параметра(literal argument) конструктору анонимного внутреннего класса (например, new SomeClass(null) { ...} вызывало ошибку компиллятора. Зато можно передать выражение со значением null, или передать принудительный null, в виде new SomeClass((String) null) { ...}

  5. Существует по меньшей мере три разных случая, которые обычно выражены с помощью null:

    • Uninitialized (отсутствие инициализации). Переменная или слот, которой ещё не присвоили никакго значения.

    • Non-existant/not applicable («не существует/не применимо»).Например, терминальные узлы бинарного дерева можно назвать обычными узлами с null-потомками.

    • Empty (пустота чего-либо). Например, вы можете использовать null чтобы представить пустое дерево. Обратите внимание, что это существенно отличается от предыдущего случая (на практике их часто путают). Разница заключается в том, является ли null приемлемым узлом дерева или null означает, что значение не нужно обрабатывать как узел дерева.

    Сравните три реализации узлов бинарного дерева с методами последовательного вывода в консоль:


  6. 
    // null означает «не применимо»
    // Здесь нет пустого дерева. 
    class Node {
      Object data;
      Node left, right;
    
      void print() {
        if (left != null)
          left.print();
        System.out.println(data);
        if (right != null)
          right.print();
      }
    }
    

  7. 
    	// null означает пустое дерево 
    // обратите внимание на статические и нестатические методы
    
    class Node {
      Object data;
      Node left, right;
    
      void static print(Node node) {
        if (node != null) node.print();
      }
    
      void print() {
        print(left);
        System.out.println(data);
        print(right);
      }
    }
    

  8. 
    	// Отдельный класс для Empty
    // null не используется
    
    interface Node { void print(); }
    
    class DataNode implements Node{
      Object data;
      Node left, right;
    
      void print() {
        left.print();
        System.out.println(data);
        right.print();
      }
    }
    
    class EmptyNode implements Node { 
      void print() { }
    }
    
Автор ответа: Питер Норвиг (Peter Norvig), американский учёный в области искусственного интеллекта, директор по исследованиям Google
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ