JavaRush /Java блог /Random UA /Чи є null Java об'єктом?

Чи є null Java об'єктом?

Стаття з групи Random UA
Чи є 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 як літеральний параметр конструктору анонімного внутрішнього класу (наприклад, 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
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ