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:
- Nie można wywołać metody o wartości null:
x.m()
zgłosi błąd, jeślix
wartość będzie równa null, am
metoda nie będzie statyczna. Nawiasem mówiąc, jeślim
jest to metoda statyczna, wszystko jest w porządku, ponieważ ważna jest tylko klasax
, a wartość jest ignorowana. - Dla wszystkich jest tylko jedna wartość null, a nie osobna dla każdej klasy. Zatem
((String) null == (Hashtable) null)
na przykład. - 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 tobutstring.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. - 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) { ...}
- 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.
-
// null означает «не применимо» // Здесь нет пустого дерева. class Node { Object data; Node left, right; void print() { if (left != null) left.print(); System.out.println(data); if (right != null) right.print(); } }
-
// 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); } }
-
// Отдельный класс для 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() { } }
Porównaj trzy implementacje węzłów drzewa binarnego z sekwencyjnymi metodami wyjściowymi konsoli:
GO TO FULL VERSION