JavaRush /Blog Java /Random-PL /Czy null jest obiektem w Javie?

Czy null jest obiektem w Javie?

Opublikowano w grupie Random-PL
Czy wartość null jest obiektem? Z całą pewnością mogę powiedzieć, że nie. W tym sensie, że (null instanceof Object)da wartość false. Oto, co jeszcze musisz wiedzieć o null:
Czy null jest obiektem w Javie?  - 1
  1. Nie można wywołać metody o wartości null: x.m()zgłosi błąd, jeśli xwartość będzie równa null, a mmetoda nie będzie statyczna. Nawiasem mówiąc, jeśli mjest to metoda statyczna, wszystko jest w porządku, ponieważ ważna jest tylko klasa x, a wartość jest ignorowana.

  2. Dla wszystkich jest tylko jedna wartość null, a nie osobna dla każdej klasy. Zatem ((String) null == (Hashtable) null)na przykład.

  3. Całkowicie akceptowalne jest przekazywanie wartości null jako parametru do metody, jeśli metoda na to pozwala (niektóre metody dopuszczają parametr null, inne nie). Możesz więc na przykład napisać System.out.println (null), ale to butstring.compareTo (null)nie zadziała. Dlatego zawsze wskazuj w komentarzach javadoc swoich metod, czy wartość null jest akceptowalna jako ich parametry, jeśli nie jest to całkowicie oczywiste.

  4. W JDK od wersji 1.1 do 1.1.5 przekazanie wartości null jako dosłownego argumentu konstruktorowi anonimowej klasy wewnętrznej (na przykład new SomeClass(null) { ...}spowodowało błąd kompilatora. Można jednak przekazać wyrażenie o wartości null lub przekazać wymuszoną null, w formienew SomeClass((String) null) { ...}

  5. Istnieją co najmniej trzy różne przypadki, które zwykle wyraża się za pomocą wartości null:

    • Niezainicjowany (brak inicjalizacji). Zmienna lub slot, któremu nie przypisano jeszcze żadnej wartości.

    • Nieistniejące/nie dotyczy Na przykład węzły końcowe drzewa binarnego można nazwać zwykłymi węzłami z dziećmi zerowymi.

    • Pusty (pustka czegoś). Na przykład możesz użyć wartości null do reprezentowania pustego drzewa. Należy pamiętać, że jest to zupełnie inny przypadek niż w poprzednim przypadku (w praktyce często są one mylone). Różnica polega na tym, czy null jest akceptowalnym węzłem drzewa, czy też null oznacza, że ​​wartość nie musi być traktowana jako węzeł drzewa.

    Porównaj trzy implementacje węzłów drzewa binarnego z sekwencyjnymi metodami wyjściowymi konsoli:


  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() { }
    }
Autor odpowiedzi: Peter Norvig, amerykański naukowiec zajmujący się sztuczną inteligencją, dyrektor ds. badań w Google
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION